我对C和编码还很陌生,所以请耐心等待。我最近一直在尝试实现一个链表,这是我提出的代码
typedef struct something{
int data;
struct something *next;
} thing ;
int main ()
{
thing *head, *current;
head=malloc(sizeof(thing));
puts("head=malloc(sizeof(thing));");
if (head != NULL)
puts("malloc success");
head=NULL;
current=head;
puts("current=head;");
if (current == NULL)
puts("current is NULL");
puts("while");
while (current!=NULL)
{
current = current->next;
}
puts("end while");
current->next=malloc(sizeof(thing));
puts("current->next=malloc(sizeof(thing));");
//free at end of program
}
虽然编译器显示0个错误,但当我运行程序时,它只运行到崩溃前的最后一个malloc
部分。它没有运行最终的puts
,所以我认为这与我尝试使用malloc的方式有关。如果有人告诉我我做错了什么,我会非常感激的。
问题是您的while
循环走得太远了。你想在current
指向列表的最后一个元素时停止,这样你就可以添加到列表中。但你要更进一步,在current == NULL
时停止。那么分配给current->next
就太晚了。
首先,您需要将head->next
初始化为NULL。
head = malloc(sizeof(thing));
head->next = NULL;
摆脱线路:
head = NULL;
因为这是在重写CCD_ 8的结果。
然后while循环需要测试current->next
,而不是current
本身:
while (current->next != NULL) {
current = current->next;
}
添加新节点时,还必须将其next
指针设置为NULL
:
current->next = malloc(sizeof(thing));
current->next->next = NULL;
这些应该可以解决你的问题。
分配head
,然后在几次检查后立即将其指针指向NULL
// Allocation here
head=malloc(sizeof(thing));
puts("head=malloc(sizeof(thing));");
// Not a null
if (head != NULL)
puts("malloc success");
// Point to NULL again ???
head=NULL;
然后你的current
再次指向head
,即NULL
,使current
NULL
current=head;
puts("current=head;");
if (current == NULL)
puts("current is NULL");
然后取消引用current
并尝试使用malloc
puts("while");
while (current!=NULL)
{
current = current->next;
}
puts("end while");
current->next=malloc(sizeof(thing)); //current is NULL here NULL->next is invalid
puts("current->next=malloc(sizeof(thing));");