求集合(用有序单链表表示)的并、交和差运算

/*exp2-6.cpp*/

#include<stdio.h>
#include<malloc.h>
typedef char ElemType;
typedef struct LNode/*定义单链表结点类型*/
{
 ElemType data;
 struct LNode *next;
}LinkList;
extern void DispList(LinkList *L);/*包含在algo2-2.cpp文件中*/
void CreateListR(LinkList * &L,ElemType a[],int n)/*尾插法建表*/
{
 LinkList *s,*r;int i;
 L=(LinkList *)malloc(sizeof(LinkList));/*创建头结点*/
 L->next=NULL;
 r=L;/*r始终指向终端结点,开始时指向头结点*/
 for(i=0;i<n;i++)
 {
  s=(LinkList *)malloc(sizeof(LinkList));/*创建新结点*/
  s->data=a[i];
  r->next=s;/*将*s插入到*r之后*/
  r=s;
 }
 r->next=NULL;/*将终端终点next域置为NULL*/
}
void Sort(LinkList * &head)/*单链表元素排序*/
{
 LinkList *p=head->next,*q,*r;
 if(p!=NULL)/*若单链表中有一个或以上的数据结点*/
 {
  r=p->next;/*r保存*p结点后继结点的指针*/
  p->next=NULL;/*构造只含一个数据结点的有序表*/
  p=r;
  while(p!=NULL)
  {
   r=p->next;/*r保存*p结点后继结点的指针*/
   q=head;
   while(q->next!=NULL && q->next->data<p->data)
    q=q->next;/*在有序表中找插入*p的前驱结点*q*/
   p->next=q->next;/*将*p插到*q之后*/
   q->next=p;
   p=r;
  }
 }
}
void Union(LinkList *ha,LinkList *hb,LinkList * &hc)/*求两有序集合的并*/
{
 LinkList *pa=ha->next,*pb=hb->next,*s,*tc;
 hc=(LinkList *)malloc(sizeof(LinkList));/*创建头结点*/
 tc=hc;
 while(pa!=NULL && pb!=NULL)
 {
  if(pa->data<pb->data)
  {
   s=(LinkList *)malloc(sizeof(LinkList));/*复制结点*/
   s->data=pa->data;
   tc->next=s;tc=s;
   pa=pa->next;
  }
  else if(pa->data>pb->data)
  {
   s=(LinkList *)malloc(sizeof(LinkList));/*复制结点*/
   s->data=pb->data;
   tc->next=s;tc=s;
   pb=pb->next;
  }
  else
  {
   s=(LinkList *)malloc(sizeof(LinkList));/*复制结点*/
   s->data=pa->data;
   tc->next=s;tc=s;
   pa=pa->next;/*重复的元素只复制一个*/
   pb=pb->next;
  }
 }
 if(pb!=NULL)pa=pb;/*复制余下的结点*/
 while(pa!=NULL)
 {
  s=(LinkList *)malloc(sizeof(LinkList));/*复制余下的结点*/
  s->data=pa->data;
  tc->next=s;tc=s;
  pa=pa->next;
 }
 tc->next=NULL;
}
void InterSect(LinkList *ha,LinkList *hb,LinkList * &hc)/*求两有序集合的交*/
{
 LinkList *pa=ha->next,*pb,*s,*tc;
 hc=(LinkList *)malloc(sizeof(LinkList));
 tc=hc;
 while(pa!=NULL)
 {
  pb=hb->next;
  while(pb!=NULL && pb->data<pa->data)
   pb=pb->next;
  if(pb!=NULL && pb->data==pa->data)/*若pa结点值在B中*/
  {
   s=(LinkList *)malloc(sizeof(LinkList));/*复制结点*/
   s->data=pa->data;
   tc->next=s;tc=s;
  }
  pa=pa->next;
 }
 tc->next=NULL;
}
void Subs(LinkList *ha,LinkList *hb,LinkList * &hc)/*求两有序集合的差*/
{
 LinkList *pa=ha->next,*pb,*s,*tc;
 hc=(LinkList *)malloc(sizeof(LinkList));
 tc=hc;
 while(pa!=NULL)
 {
  pb=hb->next;
  while(pb!=NULL && pb->data<pa->data)
   pb=pb->next;
  if(!(pb!=NULL && pb->data==pa->data))/*若pa结点值不在B中*/
  {
   s=(LinkList *)malloc(sizeof(LinkList));
   s->data=pa->data;
   tc->next=s;tc=s;
  }
  pa=pa->next;
 }
 tc->next=NULL;
}
void main()
{
 LinkList *ha,*hb,*hc;
 ElemType a[]={'c','a','e','h'};
 ElemType b[]={'f','h','b','g','d','a'};
 CreateListR(ha,a,4);
 CreateListR(hb,b,6);
 printf("原集合A:");DispList(ha);
 printf("原集合B:");DispList(hb);
 Sort(ha);
 Sort(hb);
 printf("有序集合A:");DispList(ha);
 printf("有序集合B: ");DispList(hb);
 Union(ha,hb,hc);
 printf("集合的并C: ");DispList(hc);
 InterSect(ha,hb,hc);
 printf("集合的交C: ");DispList(hc);
 Subs(ha,hb,hc);
 printf("集合的差C:");DispList(hc);
}

  • 3
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值