这个是求集合的并交差,其中的Sort算法一点不懂,拜脱详细解释下!

kakukeme 2010-10-06 04:41:00
# include <stdio.h>
# include <malloc.h>

typedef char ElemType;
typedef struct LNode //定义单链表结点类型
{
ElemType data;
struct LNode *next;
}LinkList;

void DispList(LinkList *L)
{
LinkList *p=L->next;
while (p!=NULL)
{
printf("%c",p->data);
p=p->next;
}
printf("\n");
}

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)
{
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=ha->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);

}


说说这Sort算法在排序时所依据的原则!

...全文
150 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
jimmy87 2010-10-10
  • 打赏
  • 举报
回复
void Sort(LinkList *& head) *& head错了吧? 可以这样吗?
应该是struct LinkList *Sort(LinkList *head)这样的吧
qq775723294 2010-10-10
  • 打赏
  • 举报
回复
不就是一个简单的排序吗
胖企鹅 2010-10-10
  • 打赏
  • 举报
回复
这算法效率不高,最低级的遍历搜索
michael122 2010-10-08
  • 打赏
  • 举报
回复
不就是插入排序嘛
熊熊大叔 2010-10-06
  • 打赏
  • 举报
回复
随便找本数据结构或者算法书,看看插入排序就可以了

33,006

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧