运行时错误:Singly Link List程序插入一个值

Nam*_*man 4 c algorithm data-structures

我在C中为"单一链接列表"编写了一个代码.在这段代码中,我想在列表的末尾插入元素.它汇编得很好.但是在运行时期间,预期的输出不会到来.我gcc用作编译器.每当我./a.out在终端做的时候,它就被绞死了.
这是代码:

#include<stdio.h>
#include<stdlib.h>
struct list
{
    int node;
    struct list *next; 
};

void insert(struct list *, int);
void print(struct list *);

int main()
{
    struct list *mylist;

    insert(mylist, 10);
    insert(mylist, 20);
    insert(mylist, 30);
    insert(mylist, 40);
    insert(mylist, 50);
    insert(mylist, 60);

    print(mylist);
    return 0;
}

void print(struct list *head)
{
    if(head==NULL)
        return;
    else
    {
            while(head->next!=NULL)
            {
             printf("%d\t",head->node);
             head=head->next;       
        }
    }
}


void insert(struct list *head, int value)
{   
    struct list *new_node;
    new_node = (struct list *)malloc(sizeof(struct list));

//node Creation
    new_node->node=value;
    new_node->next=NULL;

//Adding Node to list
    if(head==NULL)
    {
        head=new_node;  

    }
    else
    {
        while(head->next!=NULL);
        {   
            head=head->next;

        }
        head->next=new_node;

    }

}
Run Code Online (Sandbox Code Playgroud)

insert()是在mylistlinklist 中插入元素的函数,它print()是一个打印链接列表中所有值的函数.请帮忙.我无法理解我犯的错误.

pap*_*ane 5

我建议再做一次改变,即函数的原型应该是这样的

void insert(struct list **, int);
void print(struct list **);
Run Code Online (Sandbox Code Playgroud)

并且应该相应地改变身体.因为你在insert中已经完成了新的内存分配,所以你不应该按值传递,而应该通过地址传递,然后只有它可以按预期工作.

此外,在print函数中,循环终止应该是while(*head!= NULL)而不是while((*head) - > next!= NULL)否则它将跳过最后一个节点.

在第一次调用insert函数并且tmp指针应该在最后传递给print函数时,你应该将第一个节点存储到tmp指针中.在您的代码中,您将指针传递给错误的最后一个节点.所以,应该是这样的.

int main()
{
    struct list *mylist=NULL, *tmp = NULL;

    insert(&mylist, 10);

    tmp = mylist;   /* here */

    insert(&mylist, 20);
    insert(&mylist, 30);
    insert(&mylist, 40);
    insert(&mylist, 50);
    insert(&mylist, 60);

    /* At this point mylist is pointing to last node, so pass tmp which stores the first node */
    print(&tmp);    
    return 0;
}
Run Code Online (Sandbox Code Playgroud)