为什么链表的冒泡排序功能有时会输出错误的结果,而有时似乎是一个无限循环?

问题描述 投票:0回答:1

我正在尝试用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;
    }
}
c bubble-sort
1个回答
0
投票

请提供您的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;
        }

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

© www.soinside.com 2019 - 2024. All rights reserved.