C语言两路归并排序链表,C语言中数据结构之链表归并排序实例代码

搜索热词

C语言中数据结构之链表归并排序实例代码

问题

设有两个无头结点的单链表,头指针分别为ha,hb,链中有数据域data,链域next,两链表的数据都按递增排序存放,现要求将hb表归到ha表中,且归并后ha仍递增序,归并中ha表中已有的数据若hb中也有,则hb中的数据不归并到ha中,hb的链表在算法中不允许破坏。

源程序

#include

#include

#define N1 6 /*链表La的长度*/

#define N2 6 /*链表Lb的长度*/

struct listnode

{

int data;

struct listnode *next;

};

void createlist(struct listnode * *,int);

void listinsert(struct listnode * *,struct listnode * *);

void readlist(struct listnode *);

int main()

{

struct listnode *ha=NULL,*hb=NULL;

printf("请按照升序序列输入以下数字以建立链表La\n");

printf("Please Input %d numbers:",N1);

createlist(&ha,N1);

printf("请按照升序序列输入以下数字以建立链表Lb\n");

printf("Please Input %d numbers:",N2);

createlist(&hb,N2);

listinsert(&ha,&hb);

readlist(ha);

printf("\n");

}

void createlist(struct listnode * *p,int n)

{ /*尾插法建立链表*/

struct listnode *t,*q;

int i;

t=(struct listnode *)malloc(sizeof(struct listnode));

scanf("%d",&t->data);

*p=t;

q=t;

for(i=n-1;i>0;i--)

{

t=(struct listnode *)malloc(sizeof(struct listnode));

scanf("%d",&t->data);

q->next=t;

q=t;

}

q->next=NULL;

}

void listinsert(struct listnode * *a,struct listnode * *b)

{ /*将两个链表按递增序列排序*/

struct listnode *pa,*pb,*other,*la,*pre;

la=(struct listnode *)malloc(sizeof(struct listnode));

la->next=*a;

pa=*a;

pb=*b;

pre=la;

while(pa&&pb)

{

if(pa->datadata)

{

pre=pre->next;

pa=pa->next;

}

else if (pa->data>pb->data)

{

other=(struct listnode *)malloc(sizeof(struct listnode));

other->data=pb->data;

other->next=pa;

pre->next=other;

pre=other;

pb=pb->next;

}

else

{

pre=pre->next;

pa=pa->next;

pb=pb->next;

}

}

if(!pa)

{

while(pb)

{

other=(struct listnode *)malloc(sizeof(struct listnode));

other->data=pb->data;

pre->next=other;

pre=pre->next;

pb=pb->next;

}

pre->next=NULL;

}

*a=la->next;

free(la);

}

void readlist(struct listnode *p)

{ /*遍历链表并输出最终结果*/

struct listnode *q;

q=p;

printf("链表的排序结果为:\n");

while(q!=NULL)

{

printf("%3d",q->data);

q=q->next;

}

printf("\n");

}

运行结果

15059217181.png?2017425141430

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

总结

如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值