文章内容:
第一点:首先我们谈一谈有关链表的储存问题,首先我希望大家记住一各准则:链表的头指针尽量不要用来存储数据,为什么?因为这样会使你处理数据时更加的方便,方便在哪里?如果头指针不放数据的话,那么你在处理数据的时候,就可以将所有数据都统一对待?有的同学可能会有疑惑,结合排序说一下吧?排序的话其实就是改变各链节中的指针的指向,因为你链表的本质就是通过指针将多个链节(结构体)连接在一起,而排序就是改变链节的先后顺序,而改变它的顺序就是要改变其前后连接的的指针的指向。好讲到这里我问再回到我们最开始的问题:为什么链表的有指针不要储存数据,因为如果头指针储存数据的话,只要处理其后的指向就行,可其他的数据都要处理前后的指向关系,这就要分类讨论了,而且要考虑多很多的因素,既然如此,我干脆头指针就不储存了,这样所有的链节的处理方式都一样了。
弄懂了上面这一点后我们再来重头戏:有关排序的内容
有关链表冒泡排序的理解
首先上面也提及到了排序的问题,冒泡排序本值就是相邻比较大数(小数)后移,比较也就是说有两个物体才有比较,所以这里我们引入两个链节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(