静态链表实现集合运算(A-B)∪(B-A)
严蔚敏《数据结构》书上的题和算法
用静态链表实现(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}为例
0
A输入完之后建立的链表:
1
***.当发现B有而A没有的元素时需要Malloc节点加到A中
Difference函数中的链表Malloc过程:
2
当发现A,B都有的元素时,需要将相应的节点从A中Free掉