已知集合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;
}
}
}