已知集合A和B的元素分别用不含头结点的单链表存储,函数difference()用于求解集合A与B的差集,并将结果保存在集合A的单链表中

思路:
在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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值