求助:单链表插入节点出现问题

zaixiankaifa 2018-03-08 12:52:23
学习链表的插入数据结构,但是代码出现问题,代码如下:

#include <stdio.h>
#include <stdlib.h>

struct node
{
int num;
struct node* next;
};


struct node* create(int n); //生成链表
{
struct node* head,*p;
p=head=NULL;
int i;
for(i=0;i<n;i++)
{
struct node* point=(struct node*)malloc(sizeof(struct node));
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;
}
else
{
struct node* p1,*p2;
p1=head;
while(p->num > p1->num && p1->next != NULL)
{
p2=p1;
p1=p1->next;
}

if(p->num < p1->num)
{
if(head==p)
{
head=p;
p->next=p1;
}
else
{
p2->next=p;
p->next=p1;
}
}
else
{
p1->next=p;
p->next=NULL;
}

}


struct node* foreach;
for(foreach=head;foreach!=NULL;foreach->next=foreach)
{
printf("%d\t",foreach->num);
}

}


int main()
{
create(9);
struct node* pp=(struct node*)malloc(sizeof(struct node));
pp->num=5;
insert_node(head,5);
return 0;
}

程序运行出现结果是: 0 1 2 3 4 5 5,而不是 0 1 2 3 4 5 5 6 7 8 ,不知道哪里错误,找了好久没找出来,麻烦大神帮忙,谢谢!.

...全文
416 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
sanGuo_uu 2018-03-08
  • 打赏
  • 举报
回复
问题比较多,建议改成带头节点的单链表,逻辑上会简单点
赵4老师 2018-03-08
  • 打赏
  • 举报
回复
数据结构对单链表进行数据排序 http://bbs.csdn.net/topics/392201633
自信男孩 2018-03-08
  • 打赏
  • 举报
回复
#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; 其他问题建议对比代码找原因,如果还有不明白的,可以继续提问
paschen 2018-03-08
  • 打赏
  • 举报
回复
单步跟踪程序运行,观察每一步变量变化情况,看是哪里与你期望的不一致,分析原因
zaixiankaifa 2018-03-08
  • 打赏
  • 举报
回复
引用 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;就是这个地方出现问题;非常感谢你的解答.

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧