链接列表出现分段错误
老实说,当谈到链表时,我不知道自己在做什么。这里的东西导致了分段错误,但我对链接列表知之甚少,不知道它在哪里,更不用说,它们令人困惑。我有代码进行调试,但在发布之前将其取出。代码似乎到了main中的for语句,我得到了错误。用户输入他们想要打印的节点数量以及许多打印的随机数字,其中十个打印在每行上。链接列表出现分段错误
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
struct node_def
{
int data;
struct node_def *next;
};
typedef struct node_def node;
node *makeNode (int val);
node *insertFront(node *head,node *new);
void printList(node *head);
int numNodes = 0;
int main()
{
srand(time(0));
int i = 0;
node *head = NULL;
node *new = NULL;
printf("How many nodes? ", numNodes);
scanf("%d", &numNodes);
printf("\n");
head = insertFront(head, new);
for(i = 0; i < numNodes; ++i)
{
makeNode(numNodes);
/* printList(head);*/
/*insertFront(head, new);*/
}
printList(head);
printf("\n");
return 0;
}
node *makeNode (int val)
{
node *head = NULL;
node *new = malloc(sizeof(node));
new->data = rand() % 10000;
new->next = NULL;
if (head == NULL)
head = new;
return new;
}
node *insertFront(node *head, node *new)
{
new->next = head;
return head;
}
void printList(node *head)
{
int j = 0;
for(j = 0; j < numNodes; ++j)
{
while (head != NULL)
{
printf(" %4d", head->data);
head = head->next;
}
if(j % 10 == 0)
printf("\n");
}
return;
}
该程序在这里有多个问题。基本上你写的代码根本没有实现链表。
-
此函数makenode不正确。
node *makeNode (int val) { node *head = NULL; node *new = malloc(sizeof(node)); new->data = rand() % 10000; new->next = NULL; if (head == NULL) head = new; return new; }
在这段代码中,head被初始化为NULL。所以如果(head == NULL)将始终为真。为什么val参数在不使用时需要makeNode?您可以更新到下面的代码:
我的建议:
node *makeNode() { node *new = malloc(sizeof(node)); new->data = rand() % 10000; new->next = NULL; return new; }
你不必在这里检查头= NULL。
-
你正在做NULL指针解引用(这就是为什么你有段错误)。
node *head = NULL; node *new = NULL; head = insertFront(head, new);
这里头和新都是NULL。现在在
insertFront
,new->next
将segfault。的参数
insertFront
,头和新,尚未初始化。你不认为在插入它之前你应该先为脑袋分配内存吗?我的建议:(主函数)
node *head = makeNode(); for(i = 0; i < numNodes; ++i) { node *new = makeNode(); head = insertFront(head, new); }
-
再次的printList功能也是不正确的。我建议你看一遍并进行调试。我不想逐行检查它。
但在这里,你应该是什么真正做:
void printList(node *head) { if (head == NULL) return; node *temp = head; while (temp != NULL) { printf(" %d\n", temp->data); temp = temp->next; } }
就这么简单。我建议你仔细看看代码,并尝试一步一步地进行调试。
还要确保在将节点插入列表之前,为节点分配内存。去笔和纸的方式,跟踪你的代码一步一步。这就是我用链接列表工作的方式。
不错的分析。你没有问为什么'val'被传递给'makeNode()',但被忽略 - 使用随机数作为值,而不是传递给函数的任何值。你也调用你的'makeNode()',就好像它是一个不带参数的函数一样。 –
是的。你在那里得到了一个有效的点。我想我没有注意到makeNode正在采取val参数:)更新我的代码。 – paratrooper
'printList()'中的'if'测试是一个非常小的优化。你完全可以忽略它,这个函数也可以工作。 –
程序不能正常工作?非常具体的描述。你给什么输入?除了核心转储之外,你还能得到什么输出?调试器告诉你什么?你添加了多少诊断打印,它告诉你什么?你可以使用断言? –
@JonathanLeffler代码似乎到了main中的for语句,然后我得到错误。用户输入他们想要打印的节点数量,并且用分配给它们的随机数打印许多节点,其中十个打印在一行上。 – mychem97
你用'new = NULL'调用'insertFront'。你应该学习如何使用调试器。 – Siguza