我一般对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的方式有关。
我很乐意找人告诉我我做错了什么。
答案 0 :(得分:3)
问题是您的while
循环进行得很远。您想在current
指向列表的最后一个元素时停止,以便添加它。但是,您可以更进一步,并在current == NULL
时停止。然后为时已晚,无法分配给current->next
。
首先,您需要将head->next
初始化为NULL。
head = malloc(sizeof(thing));
head->next = NULL;
摆脱这一行:
head = NULL;
因为这将覆盖malloc()
的结果。
然后,您的while循环需要测试current->next
,而不是current
本身:
while (current->next != NULL) {
current = current->next;
}
添加新节点时,还必须将其next
指针设置为NULL
:
current->next = malloc(sizeof(thing));
current->next->next = NULL;
这些应该可以解决您的问题。
答案 1 :(得分:1)
您分配了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));");