为什么下面的代码在单链表的末尾插入一个节点不起作用?
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
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