静态链表实现集合运算(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掉
在这里插入图片描述在这里插入图片描述

.结果简化一下:

在这里插入图片描述