链表中的意外输出

时间:2012-09-04 13:07:44

标签: c linked-list

有时回来我问了一个关于链表的问题并得到了很好的答复......现在我已经使用这些建议写了一段新代码,但我遇到了一个错误。代码是:

#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
    int data;
    struct node *next;
}node;
node *mknode()
{
    return malloc(sizeof(node));
}
void create(node* h, int num)
{
    int i;
    node *temp=h;
    for(i=0;i<num;i++)
    {
        temp->data=i;
        if(i==(num-1))
            temp->next=NULL;
        else
            temp->next=mknode();
        temp=temp->next;
    }
}
node* add_end(node *h,int num)
{
    node *temp;
    if(h==NULL)
    {
        h=mknode();
        temp=h;
        create(h,num);
    }
    else
    {
        temp=h;
        while(h!=NULL){
            h=h->next;}
        h=mknode();
        create(h,num);
    }
    return temp;
}
void display(node *h)
{
    node *temp=h;
    while(temp!=NULL)
    {
        printf("%d->",temp->data);
        temp=temp->next;
    }
}
int main()
{
    node *head=NULL;
    int num;
    scanf("%d",&num);
    head=add_end(head,num);
    head=add_end(head,num);
    display(head);
    //printf("%d",list_len(head));
    free(head);
    return 0;
}

现在因为我已经两次调用add_end输入3,所以输出应该是   0→1→2→0→1→2→ 但相反,我得到了   0→1→2→

我已经检查了这一点,创建函数中的FOR循环运行了nn次输入n。 所以问题是显示函数遇到NULL但我无法弄清楚它在代码中的位置。

所有帮助表示赞赏。 提前感谢 -user1614886

1 个答案:

答案 0 :(得分:3)

add_end()中,您没有正确链接节点。

[blah blah]
else
{
    temp=h;
    while(h!=NULL){
        h=h->next;}
    h=mknode();
    create(h,num);
}

您提前h直至NULL,但您应该只移至h->next == NULL并在此处附加下一个列表。