单链表排序(代码详解)

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;
  }
}

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值