集合的交并差链式表示

来源:互联网 发布:韩国网络爆红魔鬼身材 编辑:程序博客网 时间:2024/05/03 12:14
#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,cint 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;}


原创粉丝点击