链表排序

算法:

创建一个空链表sorthead,找到链表的最大值max,删除最大值这个节点并且把它插入到空链表中,重复这个步骤,最后返回sorthead。

#include<stdio.h>
#include<stdlib.h>

typedef struct student
{
    int num;
    struct student *next;
}Lstudent,*LPstudent;

void InitLink(LPstudent *phead)
{
    Lstudent *ptr,*r;
    *phead=NULL;
    //-----------------------------------------------
    ptr=malloc(sizeof(Lstudent));
    *phead=ptr;
    ptr->next=NULL;
    //------------------------------------------------
    int n;
    printf("please input number of student:\n");
    scanf("%d",&n);
    while(n>0)
    {
        ptr=malloc(sizeof(Lstudent));
        ptr->num=n;
        ptr->next=NULL;
        if((*phead)->next==NULL)///
            (*phead)->next=ptr;//
        else
            r->next=ptr;

        r=ptr;

        printf("please input number of student:\n");
        scanf("%d",&n); }
}

void printf_link(Lstudent *ptri)
{
    ptri=ptri->next;/
    while(ptri!=NULL)
    {   
        printf("%d   ",ptri->num);
        ptri=ptri->next;
    }   
}
unsigned int ListLength(Lstudent *ptr)
{
    unsigned int l=0;
    ptr=ptr->next;//带头结点
    while(ptr!=NULL)
    {   
        l++;
        ptr=ptr->next;
    }   
    return l;
}
LPstudent ListSort(LPstudent ptr)
{
    LPstudent sorthead=NULL;//创建头指针指向空
    int l=ListLength(ptr);
    while(l>0){      //循环找出最大值
        LPstudent p1=ptr->next;
        LPstudent p2=p1;
        int max=p1->num;
        while(p1!=NULL)
        {
            if(p1->num>max)
            {max=p1->num; p2=p1;}
            p1=p1->next;
        }
        LPstudent p3=ptr->next;
        if (p3==p2)
            ptr->next=p3->next;//第一个为最大值时,删除最大值。
        else
        {   while(p3->next!=p2)
            p3=p3->next;//定位到最大值节点p2前面一个节点
    
            p3->next=p2->next;//(删除最大值)
        }

    //  p2->next=sorthead;//前插法,最大的放在了最后面(由小到大)
    //  sorthead=p2;
//-------------------------------------------------
        LPstudent r;// 后插法,由大到小
        p2->next=NULL;
        if(sorthead==NULL)
            sorthead=p2;
        else
        r->next=p2;

        r=p2;
//-------------------------------------------------     
        l--;
    }   
    LPstudent s=malloc(sizeof(Lstudent));//打印的函数是按照有头节点的链表打印的,所以要加一个头节点。
    s->next=sorthead;//sorthead指向首节点
    sorthead=s;//sorthead指向头节点
    return sorthead;

}
int main()
{
    LPstudent head;
    InitLink(&head);
    printf_link(head);
    LPstudent sorthead=ListSort(head);
    printf("------------after sort--------------\n");
    printf_link(sorthead);

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值