说实话,说到链接列表,我不知道我在做什么。这里的某些东西导致了分段错误错误,但我对链表没有足够的了解,知道它可能在哪里,更不用说,它们令人困惑。我有代码进行调试,但在发布前将其取出。代码似乎转到main中的for语句,我得到了错误。用户输入他们想要打印的节点数量,并且用随机数字打印许多节点,每行打印10个节点。
#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;
}
答案 0 :(得分:1)
这个程序有很多问题。基本上,您编写的代码根本没有实现链接列表。
此功能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。所以 if(head == NULL)将始终为true。为什么val param在你不使用时需要makeNode?您可以将其更新为以下代码:
我的建议:
node *makeNode ()
{
node *new = malloc(sizeof(node));
new->data = rand() % 10000;
new->next = NULL;
return new;
}
你不必在这里检查head = NULL。
你在main中做了NULL指针解除引用(这就是你遇到段错误的原因)。
node *head = NULL;
node *new = NULL;
head = insertFront(head, new);
这里head和new都是NULL。现在在insertFront
,new->next
将会出现段错误。
insertFront
, head 和 new 的参数尚未初始化。你认为在插入之前你应该首先为头部分配内存吗?
我的建议:(在主要功能中)
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;
}
}
就这么简单。我建议你仔细查看代码并尝试逐步调试它。
还要确保在列表中插入节点之前,为节点分配内存。按照笔和纸的方式跟踪代码步骤和步骤。这就是我如何使用链接列表。