c语言双链表排序交换节点_双向链表排序C语言程序

该博客介绍了一个C语言程序,用于实现双向链表的排序。程序首先创建一个双向链表,然后通过交换相邻节点的方式对其进行排序。排序过程中考虑了不同情况,包括链表首尾节点的交换。最后,程序输出排序后的链表元素。
摘要由CSDN通过智能技术生成

// 双向链表排序.cpp : 定义控制台应用程序的入口点。

//

#include &ltstdio.h&gt

#include &ltstdlib.h&gt

#include &ltstring.h&gt

#define len sizeof(struct node)

struct node

{

int data;

struct node *next;

struct node *last;

};

struct list

{

struct node *head,*tail;

int l;

};

void main()

{

struct list a;

printf("请输入A链表的元素个数\n");

scanf("%d",&a.l);

int i,x=1;

struct node *p1,*p2,*p3;

printf("请输入A链表的第1个数据\n");

p1=p2=(struct node*)malloc(len);

scanf("%d",&p1-&gtdata);

a.head=p1;

p1-&gtlast=NULL;

for(i=2;i&lt=a.l;i++)

{

p2=(struct node*)malloc(len);

p1-&gtnext=p2;

p2-&gtlast=p1;

p1=p2;

printf("请输入A链表的第%d个数据\n",i);

scanf("%d",&p1-&gtdata);

}

p1-&gtnext=NULL;

a.tail=p1;//链表A生成完毕//

for(p2=a.tail;p2-&gtlast-&gtlast;p2=p2-&gtlast)//考虑第一个链点进行交换的情况//

{

if(p2-&gtdata&ltp2-&gtlast-&gtdata)

{

p3=p2-&gtlast;

if(p2-&gtnext)

{

p3-&gtlast-&gtnext=p2;

p2-&gtlast=p3-&gtlast;

p2-&gtnext-&gtlast=p3;

p3-&gtnext=p2-&gtnext;

p3-&gtlast=p2;

p2-&gtnext=p3;

p2=p3;

}

else

{

p3-&gtnext=NULL;

p2-&gtlast=p3-&gtlast;

p3-&gtlast-&gtnext=p2;

p2-&gtnext=p3;

p3-&gtlast=p2;

p2=p3;

a.tail=p2;//考虑最后两个链点交换的情况//

}

}

}

if(p2-&gtlast-&gtdata&gtp2-&gtdata)

{

p3=p2-&gtlast;

p2-&gtlast=NULL;

p3-&gtnext=p2-&gtnext;

p2-&gtnext-&gtlast=p3;

p3-&gtlast=p2;

p2-&gtnext=p3;

p2=p3;

a.head=p2-&gtlast;

}

p1=a.head;

while(p1-&gtnext)

{

for(p2=a.tail;p2-&gtlast!=p1;p2=p2-&gtlast)

{

if(p2-&gtdata&ltp2-&gtlast-&gtdata)

{

p3=p2-&gtlast;

if(p2-&gtnext)

{

p3-&gtlast-&gtnext=p2;

p2-&gtlast=p3-&gtlast;

p2-&gtnext-&gtlast=p3;

p3-&gtnext=p2-&gtnext;

p3-&gtlast=p2;

p2-&gtnext=p3;

p2=p3;

}

else

{

p3-&gtnext=NULL;

p2-&gtlast=p3-&gtlast;

p3-&gtlast-&gtnext=p2;

p2-&gtnext=p3;

p3-&gtlast=p2;

p2=p3;

a.tail=p2;//考虑最后两个链点交换的情况//

}

}

}

p1=p1-&gtnext;

}

p1=a.head;

printf("%d\t",p1-&gtdata);

do

{

p1=p1-&gtnext;

printf("%d\t",p1-&gtdata);

}

while(p1-&gtnext);//新链表输出//

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值