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;
}
}
单链表排序(代码详解)
最新推荐文章于 2022-09-26 21:34:14 发布