采用选择排序法对链表进行排序,注意交换操作中不是对链表里某一节点里的某一元素进行交换,而是对两节点指针的交换

/*结构体定义*/

struct stu
{
    int StuID;//
    char name[10];//
    int sex;//
    int years;//
    struct stu *next;  
};

 

/***************************************************************
*   Function Name: SortList(struct stu *pHead)
*   Purpose: 对链表按学号进行排序
*   Inputs:
            1.pHead, 链表头指针
*   Outputs:
            NULL
*   Retrun Value: 返回int类型值
****************************************************************/
int SortList(struct stu *pHead)
{
    /*指针变量定义*/
    struct stu *pi = NULL;
    struct stu *pj = NULL;
    struct stu *psmall = NULL;
    struct stu *pafter = NULL;
    struct stu *piAfter = NULL;
    struct stu *pjAfter = NULL;
    struct stu *ptemp = NULL;
    struct stu *psmallAfter = NULL;

    piAfter = pHead;//目的是记住pi的上一个元素
    /*选择排序法*/
    for(pi = pHead->next; pi->next != NULL; pi = pi->next)
    {
        psmall = pi;
        for(pj = pi->next ; pj != NULL; psmallAfter = pj, pj = pj->next)//注意for循环的写法
        {           
            if(pj->StuID < psmall->StuID)
            {
                psmall = pj;
                pjAfter = psmallAfter;/*记住psmall的上一个元素*/
            }          
        }
        /*以下这种情况是当psmall指向的元素是链表最后一个元素时所进行的交换*/
        if(psmall->next == NULL)//这时pi肯定不等于psmall,因为pi到不了链表尾,最多是链表尾的前一个节点处
        {
            piAfter->next = psmall;
            psmall->next = pi->next;
            pjAfter->next = pi;
            pi->next = NULL;
        }
        else
        if(psmall != pi)
        {
            piAfter->next = psmall;
            pjAfter->next = pi;
            ptemp = psmall->next;//暂存
            psmall->next = pi->next;
            pi->next = ptemp;           
        }
/* 由于前面的地址交换,使得pi的值改变,这时回到第一层循环前应该将其还原到原来位置的下一个位置,
 * 由于有for语句的pi = pi->next,所以这里需要将pi还原为原来的位置
 */
        pi = piAfter->next;


        piAfter = piAfter->next;/*记住pi的上一个元素*/ 
    }
    return 0;
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值