gpt4 book ai didi

c - 为什么我的链表冒泡排序函数有时会输出错误的结果,有时又看起来像是无限循环?

转载 作者:行者123 更新时间:2023-11-30 16:10:56 24 4
gpt4 key购买 nike

我正在尝试用 C 语言编写链表的冒泡函数,但是这个函数有时会输出不正确的结果,有时甚至会进入无限循环,谁能告诉我我的循环结构有什么问题吗?

void Sort_list(Node *h) {
Node *p1 = h->next;
Node *p2 = p1->next;
Node *odd = h;
Node *h1 = p1;
Node *h2 = p2;
Node *opp = odd;
while (p2->next != NULL) {
while (p2->next != NULL) {
if (p2->score>p1->score) {
p1->next = p2->next;
p2->next = p1;
odd->next = p2;
p2 = p1->next;
odd = odd->next;
p1 = p1->next;
} else {
p2 = p2->next;
p1 = p1->next;
odd = odd->next;
}
}
opp = opp->next;
h1 = h1->next;
h2 = h2->next;
p1 = h1;
p2 = h2;
odd = opp;
}
}

最佳答案

请提供您的main() 和数据结构Node。它们可能很简单,但简单并不意味着没有错误。完整的测试需要一个可编译的程序。

虽然您没有谈论它,但我很确定零长度和单节点列表可能会发生段错误:

void Sort_list(Node *h) {
Node *p1 = h->next; //Check if h is NULL ?
Node *p2 = p1->next; //Check if h->next is NULL ?

这部分对我来说似乎很奇怪:

if (p2->score > p1->score) {
p1->next = p2->next;
p2->next = p1;
odd->next = p2;
p2 = p1->next; //Did you meant p2->next ?
odd = odd->next;
p1 = p1->next;
}

如果是这样的话,我会像这样重新设计你的循环以避免重复的代码:

        while (p2->next != NULL) {
if (p2->score>p1->score) {
p1->next = p2->next;
p2->next = p1;
odd->next = p2;
}
p2 = p2->next;
p1 = p1->next;
odd = odd->next;
}

我不确定第二个循环是否能确保所有内容从头到尾都排序。此时,您可能需要重新设计您的算法:在开始编写代码之前使用笔和纸。

关于c - 为什么我的链表冒泡排序函数有时会输出错误的结果,有时又看起来像是无限循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58776548/

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