user-0 提问: 链表中出现段错误，这该怎么改呀

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

user: user-2
content: #include <stdio.h> #include <stdlib.h>  struct link {     int data;     struct link *next; };  struct link *AppendNode(struct link *head,int data); void DisplyNode(struct link *head); void DeleteMemory(struct link *head); struct link * DeleteNode(struct link *head,int data); struct link *InsertNode(struct link *head, int nodeData);  int main() {     char    c;     int data = 0;     struct link *head = NULL;      /* 链表头指针 */     while (1)     {         scanf("%d",&data);         if (data==-1)             break;          head = AppendNode(head,data);/* 向head为头指针的链表末尾添加节点 */     }     DisplyNode(head);        /* 显示当前链表中的各节点信息 */     scanf("%d",&data);     head = InsertNode(head,data);     DisplyNode(head);        /* 显示当前链表中的各节点信息 */     DeleteMemory(head);           /* 释放所有动态分配的内存 */     return 0; } struct link *AppendNode(struct link *head,int data) {     struct link *p=(struct link *)malloc(sizeof(struct link));     p->data=data;     p->next= NULL;     struct link *r=head; #if 0    //头重脚轻，改成如下形式     if(r)     {         while(r->next)             r=r->next;         r->next=p;     }     else         head=p; #else     if (!r) {         head = p;         return head;     }      while (r->next)         r = r->next;     r->next = p; #endif     return head; }  void DisplyNode(struct link *head) {     struct link *p;     p=head;      while (p) {         if (p == head) {             printf("%d",p->data);             p = p->next;             continue;         }         printf("->%d",p->data);         p=p->next;     }     /*     if(p)     {         printf("%d",p->data);         p = p->next;     }     while(p!=NULL)     {         printf("->%d",p->data);         p=p->next;     }     */     printf("\n"); } struct link * DeleteNode(struct link *head,int data) {     struct link *p,*q,*r;     p=q=head;      while(p!=NULL)     {         if(p->data==data)         {             if(p==head)             {                 head=p->next;                 r=p;                 p=q=head;             }             else             {                 q->next=p->next;                 r=p;                 p=q->next;             }             r->next=NULL;             free(r);         }         else         {             q=p;             p=p->next;         }     }      return head; }  void DeleteMemory(struct link *head) {     struct link *p,*q;     for(p=head;p;p=q)     {         q=p->next;         free(p);     } }  struct link *InsertNode(struct link *head, int data) {     struct link *p,*q;     int i=0,t;     q=head;     p=(struct link *)malloc(sizeof(struct link));     p->data=data;     p->next=NULL;       while(q)     {         if(p->data==0)         {             p->next=q->next;             q->next=p;             t=p->data;             p->data=q->data;             q->data=t;             i++;             return head;         }         if(p->data <= q->data)         {             p->next=q->next;             q->next=p;             t=p->data;             p->data=q->data;             q->data=t;             i++;             break;         }         else         {             q=q->next;         }     }     //if(i==0)     if(q==NULL)     {         q = head;         if (q == NULL) {             head = p;             return head;         }          while(q->next)             q=q->next;         q->next=p;         p->next=NULL;     }     return head; } 供参考～  InsertNode函数有问题，当要插入的data是链表中最大的时候，需要注意的是q需要初始化一下，否则在上面的while循环的时候q已经是NULL了， 另外，head也可能是NULL。因此需要特殊处理～  建议用上面的代码测试多种情况，比如中间插入，头插，尾插都测试一下  其他问题代码里都做了修改～

user: user-0
content: 最后一个函数是在链表中添加一个新节点