最近在上数据结构,看看题目于是动手做了下,代码贴出,大家要是有建议的希望能多给我这个小菜鸟提下,谢谢!!
#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;
}