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

/*exp2-6.cpp*/

#include

#include

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

{

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->datadata)

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->datadata)

{

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->datadata)

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->datadata)

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);

}

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值