最近在上数据结构,看看题目于是动手做了下,代码贴出,大家要是有建议的希望能多给我这个小菜鸟提下,谢谢!!
#include <stdio.h> #include <stdlib.h> //创建节点 typedef struct node { char date; struct node *next; }linklist; //冒泡排序并且将相同项去除 void sort(linklist *La) { linklist *c; //用于存放相同项结点 linklist *tail = NULL; //尾结点 linklist *pre; //前驱 linklist *cur; //后驱 while(La->next != tail) //从链表头开始操作,将第一个元素和后面的比较,将大者换到后面去。反复操作直至链表尾 { pre = La; cur = pre->next; while(cur != tail && cur->next != tail) { if( cur->date > cur->next->date ) { pre->next = cur->next; cur->next = cur->next->next; pre->next->next = cur; } else //去掉相同元素 { if (cur->date == cur->next->date) { c = cur->next; cur->next = cur->next->next; free(c); continue; } } pre = pre->next; cur = pre->next; } tail = cur; //从后面往上作为结尾比较 } } //创建链表 void CreatLink(linklist *head) { char a; linklist *p,*q; q = head; head->next = NULL; head->date = '\0'; printf("请输入集合\n"); scanf("%c",&a); while(a != '\n') { if (a < 'a' || a > 'z') //去除非小写字母 { scanf("%c",&a); continue; } p = (linklist*)malloc(sizeof(linklist)); p->date = a; p->next = NULL; q->next = p; q = p; scanf("%c",&a); } } //合集 void MergeRiseList(linklist *La,linklist *Lb,linklist *Lc) { linklist *pa,*pb,*pc,*q; pa = La->next; pb = Lb->next; q = Lc; while(pa && pb) { if (pa->date < pb->date) //通过创建新的结点,存放给Lc { pc = (linklist*)malloc(sizeof(linklist)); pc->date = pa->date; q->next = pc; pc->next = NULL; q = q->next; pa = pa->next; } else { if (pa->date > pb->date) { pc = (linklist*)malloc(sizeof(linklist)); pc->date = pb->date; q->next = pc; pc->next = NULL; q = q->next; pb = pb->next; } else //如果相等,直接进行下一次 { pa = pa->next; continue; } } } pc->next = pa?pa:pb; //如果一个表结束了,就将另一个的结尾全部接过来 } //显示链表的值 void show(linklist *La) { linklist *pa; pa = La->next; if (pa == NULL) { printf("集合为空集\n"); return; } while(pa) { printf("%c",pa->date); pa = pa->next; } printf("\n"); } //交集 void MergeDropList(linklist *La,linklist *Lb,linklist *Ld) { linklist *pa,*pb,*pd,*q; pa = La->next; pb = Lb->next; q = Ld; while(pa && pb) { if (pa->date == pb->date) { pd = (linklist*)malloc(sizeof(linklist)); pd->date = pa->date; q->next = pd; pd->next = NULL; q = q->next; } pa = pa->next; pb = pb->next; } } int main() { int flag; int bMainFlag = 1; while(bMainFlag) { linklist *La,*Lb,*Lc,*Ld; La = (linklist*)malloc(sizeof(linklist)); La->next = NULL; Lb = (linklist*)malloc(sizeof(linklist)); Lb->next = NULL; Lc = (linklist*)malloc(sizeof(linklist)); Lc->next = NULL; Ld = (linklist*)malloc(sizeof(linklist)); Ld->next = NULL; printf("请选择需要完成的功能:\n"); printf("如果只需求交集则输入1;只需求并集则输入2;如果都要求请输入3;如果想要直接进行下一次输入集合请输入4;想要退出请输入0\n"); while ((scanf("%d",&flag)) && (flag < 0 || flag > 4)) { printf("输入不正确,请输入0到4的数\n"); } getchar(); if (flag == 0) { return 0; } if (flag == 4) { continue; } CreatLink(La); sort(La); CreatLink(Lb); sort(Lb); if (flag == 1) { MergeRiseList(La,Lb,Lc); printf("两个集合的并集为:"); show(Lc); } else { if (flag == 2) { MergeDropList(La,Lb,Ld); printf("两个集合的交集为:"); show(Ld); } else { MergeRiseList(La,Lb,Lc); printf("两个集合的并集为:"); show(Lc); MergeDropList(La,Lb,Ld); printf("两个集合的交集为:"); show(Ld); } } printf("如果想要进行下一次运行,请按1,否则按0直接退出程序\n"); scanf("%d",&bMainFlag); } system("Pause"); return 0; }