集合的交并差链式表示

本文通过链表实现集合的交、并、差操作。首先定义链表结构,然后通过冒泡排序对链表进行排序。接着分别实现求并集、交集和差集的函数,最后在主函数中进行测试。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值