单链表排序(代码详解)

xiaoxiao2021-02-28  112

struct Student { float stuScore; Student *pNext; }; void SortList(Student* HEAD) { Student*p, *prep, *temp, *tail;//temp是中间变量,tail判断第一层循环结束的条件,prep是待交换指针的前一个指针,p是待交换指针 tail = NULL; // 算法的核心部分 while (HEAD->pNext != tail) { prep = HEAD; p = HEAD->pNext;//p指向Head的下一个元素1 while (p->pNext != tail) { if (p->stuScore < p->pNext->stuScore)//交换p与p->next { temp = p->pNext;//这里temp的作用是保存p指针,是循环可以正常进行下去,因为下面的操作会改变p的指向 //以下三条语句可以实现将两个指针互换(断指针,连指针) prep->pNext = p->pNext; p->pNext = p->pNext->pNext; prep->pNext->pNext = p; //经过以上三条交换语句,p的位置发生了变化,但是p所代表的内容并没有改变 //经过交换后,p和p->next的位置互换.交换后p->next的位置就是交换前p的位置 p = temp;//这条语句对p重新赋值,使得p回到交换前的位置处(从而使循环可以持续进行下去) } //节点后移 p = p->pNext; prep = prep->pNext; } //减少循环的次数 //(初始时tail为NULL。因为经过第一次内循环,将最小的元素放在最后面,最后的元素就不需要再排序,所以将结束指针前移一个位置。) tail = p; } }

转载请注明原文地址: https://www.6miu.com/read-38569.html

最新回复(0)