为什么下面的代码在单链表的末尾插入一个节点不起作用?

Why does the following code to insert a node at the end of a singly linked list does not work?

C语言代码如下:

函数调用:

insert(&head,value);

void insert(struct node** headref,int value)
{
    struct node* head = (*headref); 

    while( head!=NULL )
     {

        head= head->link;
     }

    struct node* new_node=(struct node*)malloc( sizeof(struct node) );

    new_node->data=value;
    new_node->link=NULL;

    head=new_node;  
}

你需要 link 列表的最后一个元素到 new_node 否则你会失去你的 linked-ness(如果有这样一个词:) )列表。您需要在循环中存储 2 个指针 - head,您已经拥有这个指针和一个指向前一个元素(head 之前的元素)的指针。特别注意列表为空的情况!

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

在此循环结束时 head 将是 NULL。您可能希望在最后一个节点停止

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

然后做类似

的事情
head->link = new_node;

现在,如果列表为空,您必须格外小心,因为如果 head=NULL,那么 head->link 将抛出错误。 您可以在开头打勾,例如

//allocate new_node here
if(head==NULL)
{
   *headref = new_node; //Note only in this case would headref ever change
}

您正在将最后一个节点 head 替换为 new_node,这不是预期的。循环到最后一个节点并使 head->link 指向 new_node 如下所示:

insert(&head,value);

void insert(struct node** headref,int value)
{
    struct node* head = (*headref); 

    while( head->link !=NULL )
     {

        head= head->link;
     }

    struct node* new_node=(struct node*)malloc( sizeof(struct node) );

    new_node->data=value;
    new_node->link=NULL;

    head->link=new_node;  
}

逻辑错误。试试这个。

struct node* new_node=(struct node*)malloc( sizeof(struct node) );
new_node->data=value;
new_node->link=NULL;

if (!head)
{
   head = new_node;
   return;
}

// Use for or while loop as below.
// 1. for(;head->link;head=head->link); 
// or  
/* 2. */
while (head->link)
{
    head = head->link;
}
head->link = new_node;

最好用一些有意义的名字来重命名 head !

在函数局部变量head中赋值给新创建的节点。退出函数后这个局部变量会被销毁,原来的列表不会改变。

此外这个循环

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

没有意义。其实可以代替

head = NULL;

函数可以看下面的演示程序。

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

struct node
{
    int data;
    struct node *link;
};

int insert( struct node **head, int value )
{
    struct node *tmp = malloc( sizeof( struct node ) );
    int success = tmp != NULL;

    if ( success )
    {
        tmp->data = value;
        tmp->link = NULL;

        while ( *head ) head = &( *head )->link;

        *head = tmp;
    }

    return success;
}

void display( struct node*head )
{
    for ( ; head != NULL; head = head->link ) printf( " %d", head->data );
}

int main( void ) 
{
    const int N = 10;
    struct node *head = NULL;

    int i = 0;
    while ( i < N && insert( &head, i ) ) i++;

    display( head );

    return 0;
}

它的输出是

 0 1 2 3 4 5 6 7 8 9