我正在尝试用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;
}
我不确定第二个循环是否可以确保从头到尾对所有内容进行排序。此时,您可能需要重做算法:在开始编写代码之前,请使用笔和纸。