我是靠谱客的博主 谦让皮卡丘,这篇文章主要介绍用单链表求集合的并 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);

}

最后

以上就是谦让皮卡丘最近收集整理的关于用单链表求集合的并 c语言,求集合(用有序单链表表示)的并、交和差运算的全部内容,更多相关用单链表求集合的并内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(107)

评论列表共有 0 条评论

立即
投稿
返回
顶部