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

已知集合A和B的元素分别用不含头结点的单链表存储,函数difference()用于求解集合A与B的差集,并将结果保存在集合A的单链表中。例如,若集合A={5,10,20,15,25,30},集合B={5,15,35,25},完成计算后A={10,20,30}。
链表结点的结构类型定义如下:

struct node 
{ 
    int elem; 
    node* next; 
}; 

思路:
遍历A的每一个结点,通过A来遍历B中的每一个结点。
当pa为空时结束总循环。
如果此时pa所指的结点与pb所指的结点元素相同,或者pb为空时跳出内循环。
如果此时pb存在,则说明找到了,这时候就要删除。
如果pb此时指向空了,则pa要向后走一步。

void difference(node** LA,node* LB)
{
     if(LA == NULL || *LA == NULL || LB == NULL)
          return ;

     node* pa = *LA;
     node* pb = *LB;
     node* del = NULL;
     node* pre = NULL;

     //退出循环两个条件,pa为空
     while(pa)
     {
          //pb每一次都要从头开始找
          pb = LB;
          while(pb && pb -> elem != pa -> elem)
                 pb = pb -> next;
          //如果这里pb还存在也就是说满足pa,pb两个值相同
          if(pb)
          {
               //如果pre为空
               if(pre == NULL)
                    *LA = pa -> next;
               else
                    pre -> next = pa -> next;

               del = pa;
               pa = pa -> next;
               free(del);
          }
          else
          {
                pre = pa;    
                pa = pa -> next;
          }
     }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值