严蔚敏《数据结构》书上的题和算法
用静态链表实现(A-B)∪(B-A)
分析可知问题就是把A和B都有的元素从A中删去,把B有而A没有的加到A中,最后得到的A就是结果了
// // Created by dgm on 19-2-25. // #include <iostream> using namespace std; #define MAXSIZE 1000 typedef char ElemType; typedef struct{ ElemType data; unsigned int cur; }component,SLinkList[MAXSIZE]; unsigned int LocateElem_SL(SLinkList SL,ElemType e) { auto i=SL[0].cur; while(i&&SL[i].data!=e)i=SL[i].cur; if(!i)cout<<"can't find"<<endl; return i; } void InitSpace_SL(SLinkList&SL) { for (int i = 0; i < MAXSIZE-1; ++i) { SL[i].cur=i+1; } SL[MAXSIZE-1].cur=0; } unsigned int Malloc_SL(SLinkList&SL) { auto i=SL[0].cur; if(SL[0].cur)SL[0].cur=SL[i].cur; return i; } void Free_SL(SLinkList&SL, unsigned int k) { SL[k].cur=SL[0].cur; SL[0].cur=SL[k].cur; } void Print_SL(SLinkList L, unsigned int S) { while(L[S].cur) { cout << L[L[S].cur].data << " "; S=L[S].cur; } } void Difference(SLinkList&SL, unsigned int &S) { InitSpace_SL(SL); S=Malloc_SL(SL); //S用于记录链表的起始位置 auto r=S; unsigned int na,nb; cout<<"input the number of A and B: "<<endl; cin>>na>>nb; cout<<"input elements of A:"<<endl; for(int j=1;j<=na;j++) { auto i=Malloc_SL(SL); cin>>SL[i].data; SL[r].cur=i; r=i; } SL[r].cur=0; cout<<"input elements of B"<<endl; for(int j=1;j<=nb;j++) { ElemType b; cin>>b; auto p=S; auto k=SL[S].cur; while(k!=SL[r].cur&&SL[k].data!=b) { p=k; k=SL[k].cur; } if(k==SL[r].cur) { auto i=Malloc_SL(SL); SL[i].data=b; SL[i].cur=SL[r].cur; //这里为什么不像建立链表时 SL[r].cur=i; //让r始终指向链表的尾部呢? } //原来是因为B中元素只需要跟 else{ //未增减元素时的A相比较,所以 SL[p].cur=SL[k].cur; //r不动(只需要指向原来的A的尾部)就行了 Free_SL(SL,k); //因为最新增加的元素总是紧邻r if(r==k)r=p; //所以先增加的B的元素在链表后边 } } } int main() { SLinkList Ls; unsigned int S; Difference(Ls,S); Print_SL(Ls,S); return 0; }
以A={a,b,c},B={d,b}为例
A输入完之后建立的链表:
***.当发现B有而A没有的元素时需要Malloc节点加到A中
Difference函数中的链表Malloc过程:
当发现A,B都有的元素时,需要将相应的节点从A中Free掉