算法:
创建一个空链表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);
}