单向链表的排序(使用冒泡排序交换节点)

文章内容:

第一点:首先我们谈一谈有关链表的储存问题,首先我希望大家记住一各准则:链表的头指针尽量不要用来存储数据,为什么?因为这样会使你处理数据时更加的方便,方便在哪里?如果头指针不放数据的话,那么你在处理数据的时候,就可以将所有数据都统一对待?有的同学可能会有疑惑,结合排序说一下吧?排序的话其实就是改变各链节中的指针的指向,因为你链表的本质就是通过指针将多个链节(结构体)连接在一起,而排序就是改变链节的先后顺序,而改变它的顺序就是要改变其前后连接的的指针的指向。好讲到这里我问再回到我们最开始的问题:为什么链表的有指针不要储存数据,因为如果头指针储存数据的话,只要处理其后的指向就行,可其他的数据都要处理前后的指向关系,这就要分类讨论了,而且要考虑多很多的因素,既然如此,我干脆头指针就不储存了,这样所有的链节的处理方式都一样了。

弄懂了上面这一点后我们再来重头戏:有关排序的内容

有关链表冒泡排序的理解

首先上面也提及到了排序的问题,冒泡排序本值就是相邻比较大数(小数)后移,比较也就是说有两个物体才有比较,所以这里我们引入两个链节curp(当前链节),nextp(后一项链节),其中nextp=curp->next;因为相邻麻,如果是在数组中就就是这俩个兄弟的事情了,可这里是链表啊,你想像一下一群小朋友手拉手的情景,所以curp这个小朋友前面有人拉着它啊,所以这里再引入以个变量prep(前一项链节),还有后面的小朋友,因为是单项链表所以,干脆就认为它是nextp->next就算了;

上面说明了:我们改变链表中某两个链节的顺序问题,其实涉及到了4个链节(改变一支手拉这手的队伍中,某两个小朋友的顺序,需要改变4个小朋友的手拉手问题)

理解了上面之后其实就好办多了,下面是本人的手绘图解,帮助大家更好的理解:
在这里插入图片描述
下面上代码:
在代码中会对链表的生成及冒泡排序进行详细的解说:

#include <stdio.h>
#include <stdlib.h>
struct student
{
   
	int num;
	int age;
	struct student* next;
};
struct student *head = (struct student *)malloc(sizeof(struct student));
//因为链表头不储存数据,所以单独生成链表头
void main()
{
   
	void mppx();//自定义一个冒泡排序函数
	void addlb(
  • 9
    点赞
  • 59
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值