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

来源:互联网 发布:我的恐怖妻子 知乎 编辑:程序博客网 时间:2024/06/05 16:29

已知集合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;          }     }}
阅读全文
0 0
原创粉丝点击