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

来源:互联网 发布:俄罗斯现状 知乎 编辑:程序博客网 时间:2024/06/08 07:02

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




阅读全文
0 0
原创粉丝点击