思路:
在B中寻找A的元素,若是找到了,则删除A中的该元素。这样A中剩下的就是A,B的差集
例如,若集合A={5,10,20,15,25,30},集合B={5,15,35,25},完成计算后A={10,20,30}。
具体代码如下:
//,若集合A={5,10,20,15,25,30},集合B={5,15,35,25},完成计算后A={10,20,30}。
#include <iostream>
using namespace std;
struct node
{
node(int data):elem(data),next(NULL)
{}
int elem;
node* next;
};
//A={5,10,20,15,25,30
node* creat(int arr[],int size)
{
node* phead=new node(arr[0]);//头结点
node* pcur=phead;
//node* pnew=NULL;
for(int i=1;i<size;i++)
{
node* pnew=new node(arr[i]);
pcur->next=pnew;
pcur=pnew;
}
return phead;
}
void difference(node** LA , node* LB)
{
node* pa=*LA;
node* pb=LB;
node* pre=NULL;
node* temp=NULL;
while(pa)
{
pb=LB;//保证每次从LB的第一个节点找起
while(pb&&pb->elem!=pa->elem)//寻找PB中和PA相同的元素
pb=pb->next;
if(pb)//找到了
{
if(NULL==pre)//PA是头结点
*LA=pa->next;
else
{
pre->next=pa->next;//连接前后节点
}
temp=pa;
pa=pa->next;
free(temp);
}
else//没找到PA中的当前节点,继续寻找PA的下一个节点
{
pre=pa;
pa=pa->next;
}
}
}
void print(node* l)
{
node* pcur=l;
while(pcur)
{
cout<<pcur->elem<<" ";
pcur=pcur->next;
}
cout<<endl;
}
int main()
{
int A[]={5,10,20,15,25,30};
int B[]={5,15,35,25};
node* la=creat(A,sizeof(A)/sizeof(A[0]));
node* lb=creat(B,sizeof(B)/sizeof(B[0]));
difference(&la,lb);
print(la);
return 0;
}