我正在尝试编写一个在列表末尾插入节点的函数。
问题是列表的最后一个节点的指针没有指向NULL,如果我显示列表,我从系统得到一个错误。
struct node{
int value;
struct node *next;
};
struct node *AddToList (struct node *list, int n);
int main()
{
struct node *node;
node = AddToList(node, 30);
node = AddToList(node, 20);
node = AddToList(node, 10);
showlist(node);
return 0;
}
struct node *AddToList (struct node *list, int n){
struct node *new_node;
new_node=malloc(sizeof(struct node));
new_node->value=n;
new_node->next=list;
return new_node;
};
答案 0 :(得分:3)
是的,因为您插入的第一个节点 - next
不的值为NULL
。
struct node *node = NULL; //<------
node = AddToList(node, 30);
node = AddToList(node, 20);
node = AddToList(node, 10);
showlist(node);
这将解决问题。现在作为这样做的结果 - 第一次插入节点时,next
将被赋予值NULL
。因为第一次调用AddToList
list
是NULL
。
你这样做的方式 - node
包含一些不确定的值(垃圾值)(node
是一个具有自动存储持续时间的变量)然后将其作为link
添加到第一个节点。这没有实际用处,因为现在您无法遍历列表,认为您将找到NULL
值,这是您应该停止的时间。
从标准章节§6.7.9
如果未初始化具有自动存储持续时间的对象 显然,它的价值是不确定的。
您应该检查malloc
的返回值。万一它失败了 - 你应该处理那个案子。完成后,释放动态分配的内存。
还不确定你是如何尝试显示列表的,但是如果它假设最后一个节点将指向NULL
然后开始循环它 - 那么你在代码中获得了未定义的行为。
答案 1 :(得分:1)
尝试编写一个在节点末尾插入节点的函数 列表。
此功能
struct node *AddToList (struct node *list, int n){
struct node *new_node;
new_node=malloc(sizeof(struct node));
new_node->value=n;
new_node->next=list;
return new_node;
};
不会在列表末尾插入节点。它在头节点之前的列表开头插入一个节点。
在列表末尾插入节点的功能可以采用以下方式。
int AddToList ( struct node **list, int n )
{
struct node *new_node = malloc( sizeof( struct node ) );
int success = new_node != NULL;
if ( success )
{
new_node->value = n;
new_node->next = NULL;
while ( *list != NULL ) list = &( *list )->next;
*list = new_node;
}
return success;
}
该功能可以像
一样调用struct node *head = NULL;
AddToList( &head, 10);
AddToList( &head, 20);
AddToList( &head, 30);
如果您希望列表值的顺序为10,20,30。
问题是列表的最后一个节点的指针不是 指向NULL
因为在未初始化的第一个节点之前插入了新节点
struct node *node;
因此具有不确定的值,列表中的最后一个节点不指向NULL。
您必须将初始指针设置为NULL。
struct node *node = NULL;
考虑到根据C标准,没有参数的函数main应声明为
int main( void )
答案 2 :(得分:-1)
当用户想要在最后一次检查时添加节点是否为空列表,如果是这样意味着将新节点添加为头节点。如果列表不为空,则通过列表查找并通过检查tp-找出最后一个节点&gt; next = NULL然后将新节点的地址存储在tp-> gt; next并使新节点的下一个字段为NULL。以下程序清楚地显示概念
#include<stdio.h>
#include<malloc.h>
int item,count,pos;
struct node
{
int info;
struct node *next;
}*head,*tp;
void traversal()
{
if(head==NULL)
printf("\n List is empty");
else
{
tp=head;
while(tp->next!=NULL)
{
printf("\n%d",tp->info);
tp=tp->next;
}
printf("\n%d",tp->info);
}
}
void insertlast()
{
struct node *temp;
temp=(struct node*) malloc(sizeof(temp));
printf("\nEnter the element:");
scanf("%d",&item);
temp->info=item;
temp->next=NULL;
if(head==NULL)
head=temp;
else
{
tp=head;
while(tp->next!=NULL)
{
tp=tp->next;
}
tp->next=temp;
}
}
int main()
{
printf("\n\t\t**********SINGLY LINKED LIST********");
printf("\n\t------------------------------------------------------");
printf("\n\tInsertion last:");
printf("\n\t---------------------");
insertlast();
traversal();
printf("\n\tInsertion last:");
printf("\n\t---------------------");
insertlast();
traversal();
printf("\n\n\tInsertion last:");
printf("\n\t---------------------");
insertlast();
traversal();
printf("\n\n\tInsertion last:");
printf("\n\t---------------------");
insertlast();
traversal();
return 0;
}
输出
**********SINGLY LINKED LIST********
------------------------------------------------------
Insertion last:
---------------------
Enter the element:12
12
Insertion last:
---------------------
Enter the element:13
12
13
Insertion last:
---------------------
Enter the element:14
12
13
14
Insertion last:
---------------------
Enter the element:15
12
13
14
15
希望你明白。谢谢你