我正在处理单链表,无法解决问题(我认为问题是在添加带有NULL指针的函数中),问题是它只将第一个数字添加到列表中,并跳过其余的添加函数调用。
#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("%dn",first->i);
first = first->next;
}
}
int main()
{
add(36);
add(46);
add(97);
print(head);
return 0;
}
这里有两个问题。首先,在创建新节点时,不要将next
设置为NULL。因此,当您遍历列表时,您最终会读取垃圾数据,调用未定义的行为。
下一个问题是,当您遍历一个非空列表时,您会从列表的末尾"脱落",因此current
在循环的末尾为NULL,并且没有链接到列表的末尾。当current->next
为null时,您需要停止,然后在那里创建新节点。
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
}
}
您从未将node->next
设置为NULL
(对于head->next
和current->next
路径)。使用malloc
进行分配不会清除分配的内存,因此您需要自己进行分配。
此外,当您添加第二个元素时,您会进行迭代,直到current
达到NULL
,但您从未将previous_node->next
设置为指向新元素,因此您从未实际"链接"链表中的任何内容。
此外,您不应该在C.中强制转换malloc
的结果
您没有看到添加第二个和后续节点的效果的主要原因是,当您分配一个不是头节点的新节点时,您只将指向它的指针存储在函数add()
的局部变量current
中。您需要将其存储在上一个节点的next
指针中。将其与您的原始代码进行比较:
struct node* current = head;
while (current->next != NULL) {
current = current->next;
}
current->next = malloc(sizeof(*current->next));
还请注意,正如@Lousy所观察到的,您无法将新节点的next
指针设置为NULL
。您必须这样做,因为在为这些字段指定一些值之前,它们的内容是不确定的。