#include<stdio.h>
#include<malloc.h>
typedef struct ListNode
{
int data;
struct ListNode *next;
}ListType;
//创建
ListType *createlist(int n)
{
// int n;
ListType *head,*s,*r;
head=(ListType *)malloc(sizeof(ListType));
r=head;
//scanf("%d",&n);
printf("请输入集合中各个元素:\n");
for(int i=0;i<n;i++)
{//利用尾插法插入链表中各个元素
s=(ListType *)malloc(sizeof(ListType));
scanf("%d",&s->data);
r->next=s;r=s;
}
r->next=NULL;
return head;
}
void bubble_sort(ListType *Head,int n)
{//冒泡思想链表排序函数
int chage;
chage=1;//记录节点元素之间是否有交换
ListType *p,*pnext,*q;
for(int i=0;i<n-1&&chage;i++){
chage=false;
q=Head;//设置q、p、pnext节点元素的顺序位置
p=Head->next;
pnext=p->next;
while(pnext)
{
if(p->data>pnext->data)
{//若不是按从小到大的顺序则交换顺序
p->next=pnext->next;
q->next=pnext;
pnext->next=p;
q=pnext ;//重新设置q、p、pnext节点元素的顺序位置
pnext=p->next ;
chage=true;
}
else if(p->data<pnext->data){
q=p ;//若是有序的,则q、p、pnext按顺序向后移动
p=p->next ;
pnext=p->next ;
}
else
{ //若两个节点相同,则删除相同的元素,q、p、pnext按元顺序排好
q->next =pnext;
free(p);
p=pnext;
pnext=p->next ;
}
}
}
}
//显示
void display_c(ListType *lc)
{
ListType *q,*p;
p=lc->next;
q=p->next;
if(!q)
printf("操作后该集合为空集!\n");
while(p && q)
{
if(p->data==q->data)
{//输出的时候删除相同的元素
p->next=q->next;
q=p->next;
}
printf("%d ",p->data);
p=q;
q=p->next;
}
printf("%d ",p->data);//输出最后一个元素
printf("\n");
}
//并集
void unionList_Sq(ListType *la,ListType *lb,ListType *lc)//并集
{
ListType *pa,*pb,*pc,*s;
pa=la->next;
pb=lb->next;
pc=lc;
while(pa && pb)
{
s=(ListType *)malloc(sizeof(ListType));
s->next=NULL;
if(pa->data==pb->data)
{//两个元素相等时,插入一个元素,另一个向后移动
s->data=pa->data;
pc->next=s;
pc=pc->next;
pa=pa->next;
pb=pb->next;
}
else if(pa->data < pb->data)
{//a中元素小于b中元素时,插入a中元素,a向后移动
s->data=pa->data;
pc->next=s;
pc=pc->next;
pa=pa->next;
}
else
{//a中元素大于b中元素,插入b中元素,b向后移动
s->data=pb->data;
pc->next=s;
pc=pc->next;
pb=pb->next;
}
}
while(pa)
{//若b空,a不空,c中插入a中其余元素
s=(ListType *)malloc(sizeof(ListType));
s->next=NULL;
s->data=pa->data;
pc->next=s;
pc=pc->next;
pa=pa->next;
}
while(pb)
{//若a空,b不空,c中插入b中其余元素
s=(ListType *)malloc(sizeof(ListType));
s->next=NULL;
s->data=pb->data;
pc->next=s;
pc=pc->next;
pb=pb->next;
}
printf("a集合与b集合的并集为:\n");
display_c(lc);//显示操作后的集合元素
}
//交集
void mixedList_Sq(ListType *la,ListType *lb,ListType *lc)//交集
{
ListType *pa,*pb,*pc,*s;
pa=la->next;
pb=lb->next;
pc=lc;
while(pa && pb)
{
//若a中元素小于b中元素,a中元素向后移动
if(pa->data < pb->data)
pa=pa->next;
else //a中元素大于b中元素时,b中元素向后移动
if(pa->data > pb->data)
pb=pb->next;
else
{//a中元素和b中元素相同时,则是交集元素
s=(ListType *)malloc(sizeof(ListType));
s->next=NULL;
s->data=pa->data;
pc->next=s;
pc=pc->next;
pa=pa->next;
pb=pb->next;
}
}
printf("a集合与b集合的交集为:\n");
display_c(lc);//显示操作后的集合元素
}
//差集
void differentList_Sq(ListType *la,ListType *lb,ListType *lc)//差集a-b
{
ListType *pa,*pb,*pc,*s;
pa=la->next;
pb=lb->next;
pc=lc;
while(pa && pb)
{
if(pa->data==pb->data)
{//a中元素和b中元素相等时,则不是差集中元素,各自向后移动
pa=pa->next;
pb=pb->next;
}
else if(pa->data < pb->data)
{//若a中元素小于b中元素时,c中插入a中元素
s=(ListType *)malloc(sizeof(ListType));
s->next=NULL;
s->data=pa->data;
pc->next=s;
pc=pc->next;
pa=pa->next;
}
else pb=pb->next;//若a中元素大于b中元素时,b中元素向后移动
}
if(pa)
{//若a中还有元素,则c中插入a中元素
s=(ListType *)malloc(sizeof(ListType));
s->next=NULL;
s->data=pa->data;
pc->next=s;
pc=pc->next;
pa=pa->next;
}
display_c(lc);//显示操作后的结果
}
int main()
{
ListType *a, *b, *c;//集合a,b,c
int n;//集合中的个数
printf("请输入a集合中的个数:\n");
scanf("%d",&n);
a=createlist(n);//a集合初始化
bubble_sort(a,n);//a集合排序
display_c(a);//显示排序后的a集合中的元素
printf("请输入集合b中的个数:\n");
scanf("%d",&n);
b=createlist(n);//b集合初始化
bubble_sort(b,n);//b集合中元素初始化
display_c(b);//显示b中排序后的元素
c = (ListType*)malloc(sizeof(ListType)); c->next = NULL;//c头指针申请空间
unionList_Sq(a,b,c);//求a,b的并集
mixedList_Sq(a,b,c);//求a,b的交集
printf("a-b的差集为:\n");
differentList_Sq(a, b, c);//求a-b的差集
printf("b-a的差集为:\n");
differentList_Sq(b, a, c);//求b-a的差集
return 0;
}