user-0 提问: 链表排序时只有第一个是乱码，有的信息串位。

回复:
user: user-1
content: void creat(st1* head) {     int i;     int n;     st1 *p,*q;     printf("输入书籍数目:\n");     scanf("%d",&n);     for(i=0;i<n;i++)     {         printf("输入第%d个借阅信息:\n",i+1);         p = (st1*)malloc(sizeof(st1));         printf("输入编号:\n");         scanf("%d",&p->num);         printf("输入书名:\n");         scanf("%s", p->book);         printf("输入读者姓名:\n");         scanf("%s", p->name);         printf("输入借阅时间:\n");         scanf("%d",&p->time);         printf("输入第%d个借阅信息完成\n",i+1);         printf("\n");         if(0 == i)         {             head->next = p;         }         else         {             q->next = p;         }         q = p;     }     p->next = NULL; } 第一个问题：scanf输入p->name和p->book去掉前面的&。因为数组名本身就是地址值，就是数组的首地址。 同理insert,change函数里的scanf对于name和book的输入一样需要去掉&; 第二个问题：insert函数，对newst指针分配空间，为啥要给p->num, p->book等输入赋值呢？是不是应该给newst赋值呢？ 下面是我的修改： st1* insert(st1* head) {     st1 *pnew, *prev, *pcur;     int i = 1;     int index;     printf("要插入的位置:");     scanf("%d",&index);     pnew = (st1*)malloc(sizeof(st1));     if (!pnew)         exit(0);     printf("输入编号:\n");     scanf("%d",&pnew->num);     printf("输入书名:\n");     scanf("%s", pnew->book);     printf("输入读者姓名：");     scanf("%s", pnew->name);     printf("输入借阅时间:\n");     scanf("%d",&pnew->time);     printf("输入借阅信息完成\n");      prev = head;     pcur = head->next;      while (pcur) {         if (i == index) {             pnew->next = prev->next;             prev->next = pnew;             return head;         }         prev = prev->next;         pcur = pcur->next;         i++;     }     if (!pcur) {         prev->next = pnew;         pnew->next = NULL;     }     return head; #if 0     if(1 == index)     {         newst->next = head->next;         head->next = newst;          return head;     }     while( p ) {         if(i == (index-1))         {             st1 *q = p->next ;             p->next = newst;             newst->next = q;         }         p = p->next ;         i++;     }     return p; #endif } 第三个问题，sort排序，按照编号排序还有按照借阅时间排序，但是程序里只支持按照编号排序，因为按照借阅时间排序的部分，也是判断p->num > q->num； 还有，排序时，对于哨兵节点是不参与排序的，即链表的头结点。所以，循环变量初始化时，应该是p = head->next； void sort(st1 *head) {     st1 *p,*q;     int m ;     int temp;     int temp1;     char temp2[10];      printf("选择1)按编号,2)按时间排序\n");     scanf("%d",&m);     switch(m)     {         case 1:             for(p = head->next;p != NULL; p = p-> next)             {                 for (q = p->next;q != NULL; q = q-> next )                 {                     if(p->num>q->num)                     {                         temp = q->num;                         q->num = p->num;                         p->num =temp;                         temp1 = q->time;                         q->time = p->time;                         p->time =temp1;                         strcpy(temp2,q->book);                         strcpy(q->book,p->book);                         strcpy(p->book,temp2);                     }                 }             }             break;         case 2:             for(p = head->next;p != NULL; p = p-> next)             {                 for (q = p->next;q != NULL; q = q-> next )                 {                     if(p->time > q->time)                     {                         temp = q->time;                         q->time = p->time;                         p->time =temp;                         temp1 = q->num;                         q->num = p->num;                         p->num =temp1;                         strcpy(temp2,q->book);                         strcpy(q->book,p->book);                         strcpy(p->book,temp2);                      }                 }             }             break;     } } 以上参考一下吧

user: user-2
content: 数据结构对单链表进行数据排序 http://bbs.csdn.net/topics/392201633

user: user-0
content: 谢谢大家了，问题解决了。