user-0 提问: c语言  链表初级排序问题 

回复:
user: user-1
content: 那有可能就是排序错了

user: user-2
content: #include<stdio.h> #include<string.h> #include<stdlib.h>  #define LEN sizeof(struct stu)  struct stu          //存储单元 {     int stunum;     float score;     struct stu *next; };  int n=0;    //输入的数据数目  struct stu *creat();     //创建链表,要求输入的学号不按顺序，但是链表要按学号顺序排列。   返回head地址 void print(struct stu *);  //打印链表 void sortll(struct stu *,struct stu *,int );   //插入数据，输入 首地址，需要插入的数据，已经总的数据数量。  void insert_sort(struct stu **head, struct stu *pnew); void print_link(struct stu *head);  int main() {     struct stu *p;     p = creat();     //print(p);     print_link(p);     system("pause");     return 0; }  struct stu *creat() //创建链表 {     struct stu *head = NULL;    //首地址     struct stu *p0;      //p0为每次输入的数据地址     p0 = (struct stu *)malloc(LEN);     p0 ->next = NULL;     scanf("%d %f",&p0 ->stunum,&p0 ->score);     while(p0 ->stunum != 0)     //以学号为0作为输入结束的标志     {         n++;    //输入的数据个数         if(n == 1)    //如果是第一次输入数据         {             head = p0;             p0 = (struct stu *)malloc(LEN);             p0 ->next = NULL;         }         else             //如果不是第一次输入数据,则需要进行排序         {             //sortll(head,p0,n);      //传入 首地址，需要插入的数据，以及已经输入的数据数量n(包括需要排序的数据)             insert_sort(&head, p0);             p0 = (struct stu *)malloc(LEN);             p0 ->next = NULL;         }         scanf("%d %f",&p0 ->stunum,&p0 ->score);  //输入新的数据     }     free(p0);    //最后一个节点输入的都是0,那么是不会加入链表的，所以这儿释放掉     return head;        // 返回值为链表首地址 }    void print(struct stu *head)     //打印链表 {     struct stu *p1;     printf("有%d组数据 ：\n",n);     p1 = head;     printf("学号为%d的同学,成绩是%.1f\n",p1 ->stunum,p1 ->score);     while(--n)     {         p1 = p1 ->next;         printf("学号为%d的同学,成绩是%.1f\n",p1 ->stunum,p1 ->score);     } }   void insert_sort(struct stu **head, struct stu *pnew) {     struct stu *pcur = *head;      while (pcur) {         if (pcur->stunum > pnew->stunum)             break;         if (pcur->next == NULL)             break;         pcur = pcur->next;     }     if (pcur == *head) {         pnew->next = *head;         *head = pnew;     } else {         pnew->next = pcur->next;         pcur->next = pnew;     } }  void print_link(struct stu *head) {     struct stu *pcur = head;      while (pcur) {         printf("学号为%d的同学,成绩是%.1f\n",pcur ->stunum, pcur ->score);         pcur = pcur->next;     } }  void sortll(struct stu *head,struct stu *p0,int n) {     struct stu *p1 = head,*p2;     int num = n-2;     if(head ->stunum > p0 ->stunum)            //输入数据排第一的情况     {         head = p0;         head ->next = p1;         return ;     }     else if(n == 2)           //只有两个数据 然后输入数据排第二     {         head ->next = p0;         p0 ->next = NULL;         return ;     }     else                 //有多个数据  输入数据不排第一     {         p2 = head ->next;             //p2 :从第二个数据开始    p1一直是p2的前一数据         while(--num)     //与中间的数据比较（除首尾） 比较了 n-3次         {             if(p2 ->stunum > p0 ->stunum)             {                 p1 ->next = p0;                 p0 ->next = p2;                 return ;             }             else             {                 p1 = p2;                 p2 = p1 ->next;             }         }         if(p2 ->stunum > p0 ->stunum)   //在这里，p2已经是需要比较的最后一个数据         {             p1 ->next = p0;             p0 ->next = p2;             p2 ->next = NULL;         }         else         {             p2 ->next = p0;             p0 ->next = NULL;             return ;         }     } } 供参考～  排序没必要那么麻烦，插入排序，可以参考一下～