我正在处理单链表并且无法解决问题(我认为问题是在添加函数的情况下使用NULL指针),问题是它只添加第一个数字列表并跳过其余的调用来添加函数。 / p>
#include<stdlib.h>
#include<stdio.h>
struct node
{
int i;
struct node* next;
};
struct node* head = NULL;
int add(int val)
{
if(head == NULL)
{
head = (struct node*)malloc(sizeof(struct node));
head->i = val;
}
else
{
struct node* current = head;
while(current != NULL)
{
current = current->next;
}
current = (struct node*)malloc(sizeof(struct node));
current->i = val;
}
}
int print(struct node* first)
{
while(first != NULL)
{
printf("%d\n",first->i);
first = first->next;
}
}
int main()
{
add(36);
add(46);
add(97);
print(head);
return 0;
}
答案 0 :(得分:2)
您永远不会将node->next
设置为NULL
(适用于head->next
和current->next
路径)。使用malloc
进行分配并不会清除已分配的内存,因此您需要自己执行此操作。
此外,当您添加第二个元素时,您正在迭代直到current
到达NULL
,但您从未将previous_node->next
设置为指向新元素,因此您实际上从未# 34;连结&#34;链接列表中的任何内容。
答案 1 :(得分:2)
这里有两个问题。首先,在创建新节点时,不要将next
设置为NULL。因此,当您遍历列表时,最终会读取垃圾数据,并调用undefined behavior。
接下来的问题是当你遍历一个非空列表时,你“脱落”了列表的末尾,所以current
在循环结束时为NULL,并且没有到结尾的链接的清单。您需要在current->next
为空时停止,然后在那里创建新节点。
void add(int val) // change return type to void since nothing is being returned
{
if(head == NULL)
{
head = malloc(sizeof(struct node)); // don't cast return value of malloc
head->i = val;
head->next = NULL; // terminate list
}
else
{
struct node* current = head;
while(current->next != NULL) // loop until you're on the last node
{
current = current->next;
}
current->next = malloc(sizeof(struct node));
current->next->i = val;
current->next->next = NULL; // terminate list
}
}
答案 2 :(得分:2)
您没有看到添加第二个节点和后续节点的影响的主要原因是,当您分配一个不是头节点的新节点时,只将指针存储在本地变量current
中功能add()
。您需要将其存储在前一节点的next
指针中。将其与原始代码进行比较:
struct node* current = head;
while (current->next != NULL) {
current = current->next;
}
current->next = malloc(sizeof(*current->next));
另请注意,正如@Lousy所观察到的那样,您无法将新节点的next
指针设置为NULL
。你必须这样做,直到你为这些字段分配一些值,它们的内容是不确定的。