gpt4 book ai didi

c - Mergesort 实现中的段错误

转载 作者:行者123 更新时间:2023-12-03 22:40:36 26 4
gpt4 key购买 nike

我有一个程序 Mergesort 与无序列表一起工作。我得到的问题是段错误(核心转储)。

实际上,我经常收到此错误,但我不知道如何解决。此外,它不会显示任何错误或警告消息来查找它。在这个源代码和其他一般情况下,我真的需要知道为什么我有这个以及我如何修复它。

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

typedef struct node_t node;
typedef struct node_t { int key; node *next; } node;
static node *head, *z;
node *merge(node *a, node *b)
{
z->next =z;
node *c = z;
do
{
if (a->key > b->key)
{
c->next = a; c = a; a = a->next;
}
else
{
c->next = b; c = b; b = b->next;
}
} while (c != z);
c = z->next;
z->next = NULL;
return c;
}
node *mergesort(node *c) {
node *a = NULL;
node *b = NULL;
if (c != NULL && c->next->next != NULL) {
a = c; b = c;
while (b->next != NULL && b->next->next != NULL) {
c = c->next;
b = b->next->next;
}
b = c->next;
c->next = NULL;
return merge(mergesort(a), mergesort(b));
}
return c;
}
void printList(node* node)
{
while (node != NULL) {
printf("%d ", node->key);
node = node->next;
}
}
node *listcreate(int n, node *a)
{
node *head = NULL;
node *temp = NULL;
node *p = NULL;
int i=0;
while(i<n)
{
temp = (node*) malloc(sizeof(node*));
printf("Please insert the number: ");
scanf("%d", &(temp->key));
temp->next = NULL;
if(head == NULL)
head = temp;
else
{
p = head;
while(p->next != NULL)
p = p->next;
p->next = temp;
}
i++;
}
a = head;
}
int main()
{
node *a = NULL;
listcreate(3, a);
a = mergesort(a);
printf("Sorted Linked List is: \n");
printList(a);

getchar();
return 0;
}

最佳答案

首先调用你的函数 mergesort同时包括 stdlib.h是不正确的,应该会在最近的 C 编译器中引发错误。

接下来,此代码序列通过取消引用空指针来调用未定义行为:

node *z = NULL;
node *c = z;
c->next = a; // UB!

那时, c NULL,所以你不能使用 c->next .使用常见的 C 实现尝试写入导致 seg 错误的不允许的内存。

您的算法尝试使用哨兵,但恕我直言,这不是一个合适的用例。只记住第一个值更简单。并且您还应该处理到达两个排序列表之一末尾的情况。代码可以变成:
node *merge(node *a, node *b)
{
node *c = z; // current node initialized to null
node *top; // declare the future return value
do
{
if (a->key > b->key)
{
if (c == z) top = a; // if first value, remember it
else c->next = a; // else add the node to current list
c = a; a = a->next;
if (a == NULL) { // explicitely handle end of input list
c->next = b;
break;
}
}
else
{
if (c == z) top = b;
else c->next = b;
c = b; b = b->next;
if (b == NULL) {
c->next = a;
break;
}
}
} while (c != z);
return top;
}

但这还不是全部。您的代码是 C 和 C++ 的混合体。您只使用 C 库函数,但使用 C++ 编译器编译代码。 C 语言不允许函数重载,因此您不应重复使用具有不同参数集 ( mergesort ) 的标准库函数的名称。而在 C 语言中, you need not cast malloc .

即使使用我的修复,您的代码也会在任何体面的情况下崩溃 C 如果不更改 mergesort 的名称,则编译器功能。你被警告了。

关于c - Mergesort 实现中的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60146985/

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