已知集合A和B的元素分别用不含头结点的单链表存储,函数difference()用于求解集合A与B的差集,并将结果保存在集合A的单链表中。例如,若
集合A={5,10,20,15,25,30},
集合B={5,15,35,25},
完成计算后A={10,20,30}。
思路:首先明白差集的定义:所有属于A但不属于B的元素就是A的差集。所以这道题就是要找到A和B相同的元素并在A集合中删除即可。
用两层循环,第一层控制集合A,第二层控制集合B,处理结点在第二层循环内。
还要注意的是,删除A中的结点之后B的当前结点是不动的,否则两个相邻的相同的结点只能删除一个。
void difference(pList* LA, pList LB)
{
pNode pa = *LA;
pNode prev = NULL; //保存A当前结点的前一个结点
while (pa)
{
pNode pb = LB;
while (pb)
{
if (pa->data == pb->data) //遇到相同的元素才删除
{
Node* tmp = pa->next;
if (prev == NULL) //删除第一个结点要更新链表,否则找不到
*LA = tmp;
else
prev->next = tmp; //将链表重新链接起来
delete pa;
pa = tmp;
}
else
{
pb = pb->next;
}
}
prev = pa;
pa = pa->next;
}
}
测试:
集合A={5,5,10,20,15,25,30},
集合B={5,15,35,25},
完成计算后A={10,20,30}