gpt4 book ai didi

c - 我的链表代码有什么错误?

转载 作者:太空宇宙 更新时间:2023-11-04 00:34:41 25 4
gpt4 key购买 nike

这是我用 ANSI C 编写的代码。我不断收到运行时错误:段错误 (SIGSEGV)。请帮帮我。我是数据结构和 C 的新手。我无法检测到问题。

#include<stdio.h>
#include<stdlib.h>

typedef struct node
{
int data;
struct node *nxt;
}node;

node * create(int n);
void display(node *head);

int main()
{
int n = 0;
node *head = NULL;
printf("Enter the number of nodes\n");
scanf("%d", &n);
head = create(n);
display(head);
return 0;
}

node * create(int n)
{
int i;
node *head = NULL;
node *temp = NULL;
node *p = NULL;
for (i = 0; i < n; i++)
{
temp = (node *)malloc(sizeof(node));
printf("\nEnter the value of %d node", i + 1);
scanf("%d", &temp->data);
temp->nxt = NULL;
if (head == NULL)
{
head = temp;
}
else
{
p = head;
while (p->nxt != NULL)
{
p = p->nxt;
p->nxt = temp;
}

}

}
return head;
}

void display(node *head)
{
node *p = NULL;
if (head = NULL)
{
printf("\nEmpty List");
}
else
{
p = head;
while (p != NULL);
{
printf("%d->", p->data);
p = p->nxt;
}
}
}

最佳答案

Thomas Jager在他的 answer 中给你一个重要的修复.我在我的 comment 中给了你两个重要的修复.当这些组合在一起时,代码对我有用。

#include <stdio.h>
#include <stdlib.h>

typedef struct node
{
int data;
struct node *nxt;
} node;

node *create(int n);
void display(node *head);

static void error(const char *msg)
{
fprintf(stderr, "%s\n", msg);
exit(EXIT_FAILURE);
}

int main(void)
{
int n = 0;
node *head = NULL;
printf("Enter the number of nodes: ");
if (scanf("%d", &n) != 1)
error("failed to read an integer");
head = create(n);
display(head);
return 0;
}

node *create(int n)
{
int i;
node *head = NULL;
node *temp = NULL;
node *p = NULL;
for (i = 0; i < n; i++)
{
temp = (node *)malloc(sizeof(node));
if (temp == NULL)
error("failed to allocate memory");
printf("\nEnter the value of %d node: ", i + 1);
if (scanf("%d", &temp->data) != 1)
error("failed to read an integer");
temp->nxt = NULL;
if (head == NULL)
{
head = temp;
}
else
{
p = head;
while (p->nxt != NULL)
{
p = p->nxt;
}
p->nxt = temp;
}
display(head); // Debugging - check the list as it is built
}
return head;
}

void display(node *head)
{
node *p = NULL;
if (head == NULL)
{
printf("Empty List\n");
}
else
{
p = head;
while (p != NULL)
{
printf("%d->", p->data);
p = p->nxt;
fflush(stdout); // Band-aid - remove ASAP
}
putchar('\n');
}
fflush(stdout); // Band-aid - remove ASAP
}

我在输入代码中使用了 display 函数来确保列表始终正常工作。它说明了下面显示的列表的额外副本。该代码还以换行符终止输出行,这有助于确保它出现。有两个已记录的对 fflush(stdout) 的“删除我”调用是不需要的,但在代码崩溃时调试时很有帮助。有部分论点认为提示 printf() 调用后应跟有 fflush(stdout) 以确保出现提示。交互式输出通常不需要。

请注意,我添加了一个错误报告功能,以便于报告错误,因此提供了检测可能错误的鼓励。你可以在我的 SOQ 中看到我首选的错误处理代码(堆栈溢出问题)GitHub 上的存储库作为文件 stderr.cstderr.hsrc/libsoq子目录。

当我使用数据结构(例如列表)时,我通常会自己创建一个 dump_list() 函数。通常有 2 或 3 个参数:

void dump_list(const char *tag, const node *list);
void dump_list(FILE *fp, const char *tag, const node *list);

'tag' 参数用于注释输出:

dump_list(__func__, head);  // In create()

dump_list("result", head); // In main()

标签很重要;它允许您为每个使用该函数的地方创建一个不同的标记(我使用了 dump_list("point 1", …), dump_list("point 2", …) , … 在很多情况下都在一个函数中)。如果我认为我可能需要将它转到标准输出以外的地方(例如,标准错误或日志文件),我会为自己提供带有 FILE * 参数的版本。使用它可以让你检查你的数据结构。请注意,该函数不允许修改数据结构。 display() 函数的格式可能与 dump_list() 函数不同——在这种情况下,您不会调用 dump_list()main() 函数中。但是,拥有这样一个功能来验证您的数据结构会有很大帮助。

根据显示的代码,我可以运行程序(ll53ll53.c 创建,使用 GCC 8.1 set fussy 编译干净),如下所示:

$ gcc -O3 -g -std=c11 -Wall -Wextra -Werror -Wmissing-prototypes \
> -Wstrict-prototypes ll53.c -o ll53
$ ./ll53
Enter the number of nodes: 1

Enter the value of 1 node: 234
234->
234->
$ ./ll53
Enter the number of nodes: 2

Enter the value of 1 node: 234
234->

Enter the value of 2 node: 123
234->123->
234->123->
$ ./ll53
Enter the number of nodes: 7

Enter the value of 1 node: 987
987->

Enter the value of 2 node: 888
987->888->

Enter the value of 3 node: 789
987->888->789->

Enter the value of 4 node: 345
987->888->789->345->

Enter the value of 5 node: 444
987->888->789->345->444->

Enter the value of 6 node: 543
987->888->789->345->444->543->

Enter the value of 7 node: 0
987->888->789->345->444->543->0->
987->888->789->345->444->543->0->
$ ./ll53
Enter the number of nodes: 0
Empty List
$

关于c - 我的链表代码有什么错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50585396/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com