链表求A与B的差集
2015-09-23 23:10
537 查看
集合A用单链表La表示,集合B用单链表Lb表示,设计算法求A与B两个集合的差,即A-B
分析:A-B即属于A而不属于B的元素,对集合A的每个元素x,在集合B中进行查找,如果存在与x相同的元素,删除x在A中的结点。
#include<stdio.h> #include<stdlib.h> typedef struct Lnode { int data; struct Lnode *next; }Lnode; struct Lnode *create()//尾插法建立链表,不熟悉的请见数据结构之链表基础 { Lnode *head, *p, *p2; head = (Lnode *)malloc(sizeof(Lnode)); head->next = NULL; p = head; int x; scanf_s("%d", &x); while (x != -1) { p2= (Lnode *)malloc(sizeof(Lnode)); p2->data = x; p->next = p2; p = p2; scanf_s("%d", &x); } p->next = NULL; return head; } void outline(Lnode *head) { Lnode *p; p = head->next; while (p != NULL) { printf(" %2d", p->data); p = p->next; } } Lnode *chaji(Lnode *La, Lnode *Lb)//属于La而不属于Lb的元素 { Lnode *p, *prep,*q,*r; prep = La; p = La->next;//p是La中的某一结点,prep是p的前驱结点; while (p != NULL) { q = Lb->next;//依次扫描Lb看是否有与La表中p指向的结点相同的结点 while (q && q->data != p->data)q = q->next; if (q != NULL)//在Lb中找到与La中p指向的结点相同的结点,删除p指向的结点 { r = p; prep->next = p->next;//删除结点 p = p->next;//指向下一个结点 free(r); } else //未找到相同结点,继续在La中找,p指向下一个,s指向p前驱 { prep = p; p = p->next; } } return La; } int main() { Lnode *La,*Lb; printf("输入La元素,-1结束\n"); La= create(); outline(La); printf("\n输入Lb元素,-1结束\n"); Lb = create(); outline(Lb); printf("\nLa与Lb的差集\n"); La = chaji(La, Lb); outline(La); }
相关文章推荐
- npm 发布包
- 2015 Google hosts 持续更新【更新于:2015-09-22】
- 2.3-tomcat中JDK安装
- java数组一些便利的方法
- java心路历程--高潮
- [Linux]动态链接库静态替换
- UITextView上下空白间距的问题处理
- 新的疑问(未解决):VC项目的配置,不是都能在Project -- Properties里设置解决的
- https://github.com/yrs244742688/GeneratePemWithMoAndEx RSA加密
- 条款40:明智而审慎地使用多重继承(use multiple inheritance judiciously)
- jni
- unique() 去重函数
- MDT 2013 update 1同时导入两个intel 3.0 USB xHCI驱动导致蓝屏的解决办法
- 两个栈模拟一个队列
- [Spring]Spring AOP学习笔记(3)---Spring JDBC总结
- freemarker教程
- mac apktool配置
- meanshift聚类的实现
- [最小生成树+二进制枚举]UVa1151 - Buy or Build
- Linux下rz,sz与ssh,SecureCRT的配合使用