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



下面是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;  
}

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

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

在这个循环的末尾,head将是NULL。您可能想要在最后一个节点

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

,然后像

head->link = new_node;

现在你必须特别注意如果列表是空的,因为head->link会抛出错误,如果head=NULL。您可以将支票放在开头,如

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

您正在用new_node替换最后一个节点head,这是不期望的。循环到最后一个节点,使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

相关内容

  • 没有找到相关文章

最新更新