user-0 提问: 求助:单链表插入节点出现问题

回复:
user: user-1
content: 问题比较多，建议改成带头节点的单链表，逻辑上会简单点

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

user: user-3
content: #include <stdio.h> #include <stdlib.h>  struct node {     int num;     struct node* next; };   struct node* create(int n) {     struct node* head,*p, *point;     p = head = NULL;     int i;     for(i=0;i<n;i++)     {         point=(struct node*)malloc(sizeof(struct node));         if (!point)             exit(0);         point->num=i;         if(0==i)         {             head=point;         }         else         {             p->next=point;         }         p = point;     }     point->next=NULL;     return head; }    struct node* insert_node(struct node* head,struct node* p)   //插入节点,head为链表的头结点,p为需要插入的节点. {     if (!head)     {         head = p;         p->next=NULL;         return head;     }      struct node* p1,*p2;     p1 = head;      while(p1 && p->num > p1->num)     {         p2 = p1;         p1 = p1->next;     }      if(p->num <= p1->num)     {         if(head == p1) /* head 和 p1比较，怎么可以和p比较呢*/         {             head = p;             p->next = p1;         }         else         {             p2->next = p;             p->next = p1;         }     }     else     {         p1->next = p;         p->next = NULL;     }      return head; }  void show_nodes(struct node *head) {     struct node* foreach;     for(foreach = head;foreach!=NULL;foreach = foreach->next)     {         printf("%d\t",foreach->num);     }     putchar(10); }   int main() {     struct node *head = create(9);     show_nodes(head);     struct node* pp = (struct node*)malloc(sizeof(struct node));     if (!pp)         return -1;     pp->num = -1;     head = insert_node(head, pp);     show_nodes(head);      return 0; } 参考一下吧 有多出错误，建议对比查找原因。 比如：insert_node函数，如果插入的位置是head前，那么head就会被更新，就需要返回新的head。 for(foreach=head;foreach!=NULL;foreach->next=foreach)    {         printf("%d\t",foreach->num);    } 建议显示功能单独用一个函数实现。另外foreach->next=foreach应该改成foreach = foreach->next; 其他问题建议对比代码找原因，如果还有不明白的，可以继续提问

user: user-4
content: 单步跟踪程序运行，观察每一步变量变化情况，看是哪里与你期望的不一致，分析原因

user: user-0
content: 引用 2 楼 cfjtaishan 的回复:#include <stdio.h> #include <stdlib.h>  struct node {     int num;     struct node* next; };   struct node* create(int n) {     struct node* head,*p, *point;     p = head = NULL;     int i;     for(i=0;i<n;i++)     {         point=(struct node*)malloc(sizeof(struct node));         if (!point)             exit(0);         point->num=i;         if(0==i)         {             head=point;         }         else         {             p->next=point;         }         p = point;     }     point->next=NULL;     return head; }    struct node* insert_node(struct node* head,struct node* p)   //插入节点,head为链表的头结点,p为需要插入的节点. {     if (!head)     {         head = p;         p->next=NULL;         return head;     }      struct node* p1,*p2;     p1 = head;      while(p1 && p->num > p1->num)     {         p2 = p1;         p1 = p1->next;     }      if(p->num <= p1->num)     {         if(head == p1) /* head 和 p1比较，怎么可以和p比较呢*/         {             head = p;             p->next = p1;         }         else         {             p2->next = p;             p->next = p1;         }     }     else     {         p1->next = p;         p->next = NULL;     }      return head; }  void show_nodes(struct node *head) {     struct node* foreach;     for(foreach = head;foreach!=NULL;foreach = foreach->next)     {         printf("%d\t",foreach->num);     }     putchar(10); }   int main() {     struct node *head = create(9);     show_nodes(head);     struct node* pp = (struct node*)malloc(sizeof(struct node));     if (!pp)         return -1;     pp->num = -1;     head = insert_node(head, pp);     show_nodes(head);      return 0; } 参考一下吧 有多出错误，建议对比查找原因。 比如：insert_node函数，如果插入的位置是head前，那么head就会被更新，就需要返回新的head。 for(foreach=head;foreach!=NULL;foreach->next=foreach)    {         printf("%d\t",foreach->num);    } 建议显示功能单独用一个函数实现。另外foreach->next=foreach应该改成foreach = foreach->next; 其他问题建议对比代码找原因，如果还有不明白的，可以继续提问   我发现最关键的地方就在把p->num < p1->num  改成p->num <= p->num就不会出现这个问题,如果仅仅是< ,则不会执行添加插入节点的操作,只会执行最后p1->next=p;p->next=NULL;就是这个地方出现问题;非常感谢你的解答.