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