求解集合A和集合B的差集

来源:互联网 发布:c语言词汇 编辑:程序博客网 时间:2024/06/05 11:03

求解集合A和集合B的差集

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

算法思想:取出集合A中每一个元素,与集合B中对比,找到即可删除此节点,否则保留。
prev实现删除节点后的连接
当prev=NULL时,说明是首次找到A和B的公有元素,此时*LA指向pa->next,*LA仍然是头结点;
当prev!=NULL时,prev指向pa->next,实现删除结点的链接。
代码实现:
#include #include #include typedef struct ListNode{int elem;struct ListNode* next;}Node,*pNode,*pList;void Init(pList* pplist){assert(pplist);*pplist = NULL;}pNode BuyNode(int x){pNode cur = (pNode)malloc(sizeof(Node));if (cur == NULL){perror("malloc");return NULL;}cur->elem = x;cur->next = NULL;return cur;}void Push(pList* pplist, int x){pNode NewNode = BuyNode(x);if (*pplist == NULL){*pplist = NewNode;}else{pNode cur = *pplist;while (cur->next){cur = cur->next;} cur->next = NewNode;}}void Print(pList plist){pNode cur = plist;while (cur){printf("%d ", cur->elem);cur = cur->next;}printf("NULL\n");}void difference(pNode* LA, pNode LB){pNode pa, pb, q;pNode prev = NULL;pa = *LA;               //*LA是指向指针的指针,pa指向集合的元素while (pa){pb = LB;            //pb指向集合的元素while (pb && pa->elem != pb->elem)pb = pb->next;if (pb)             //pa所指向元素与pb所指的元素相等{if (!prev){*LA = pa->next;}else{prev->next = pa->next;}q = pa;          //求差集,即删除pa结点pa = pa->next;free(q);}else{prev = pa;pa = pa->next;}}}void Test(){pList plist1;Init(&plist1);Push(&plist1, 12);Push(&plist1, 2);Push(&plist1, 92);Push(&plist1, 1);Push(&plist1, 11);Print(plist1);pList plist2;Init(&plist2);Push(&plist2, 12);Push(&plist2, 21);Push(&plist2, 92);Push(&plist2, 1);Print(plist2);difference(&plist1, plist2);Print(plist1);}
测试结果:


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