c++链表排序程序RE


void sort(){
        De_node *fst = head, *snd = fst->next, *lin = new De_node();
        for(int i = 0; i < Size - 1; i++){
            fst = head, snd = fst->next, lin = fst->prev;
            for(int j = Size - i - 1; j > 0; j--){
                if(fst->val > snd->val){
                    fst->next = snd->next;
                    snd->next = fst;
                    lin->next = snd;
                }
            }
            lin = lin->next;
            fst = lin->next;
            snd = fst->next;
        }
        delete lin;
    }

定义了一个De-node类,想给历览表实现排序,结果RE

引用 皆我百晓生 小程序回复内容作答:
RE(Runtime Error)意味着程序在运行时遇到了错误,导致程序异常终止。

在你的代码中,有一个删除操作 delete lin; 可能导致RE。尽管删除了lin节点,但在之后的循环中仍然使用了lin->next来更新lin指针,这可能导致访问已释放的内存,从而导致错误。

此外,你的排序算法似乎存在问题。你只是交换了fst和snd节点的位置,但没有更新其他相关节点的指针。正确的链表排序算法涉及到节点之间的连接操作,你需要仔细思考如何更新链表节点的指针。

另外,你的代码没有给出完整的实现,无法准确判断其他潜在的错误。可能还需要检查其他部分的代码逻辑,如链表的构建和节点指针的正确性等。

建议你仔细检查代码的逻辑,并根据需要进行代码修正,以解决RE和排序错误的问题。同时,确保在运行程序之前对链表进行合适的初始化和构建,以确保链表的完整性。

【以下回答由 GPT 生成】

你的程序可能存在以下问题: 1. 未检查链表是否为空或只有一个节点。在没有检查链表是否为空或只有一个节点的情况下进行排序可能会导致程序运行错误。 2. 在交换节点位置时,未更新链接的正确顺序。 3. 没有正确更新 head 指针。

以下是修复问题的建议:

void sort(){
    if(head == nullptr || head->next == nullptr){
        return; // 如果链表为空或只有一个节点,则无需排序
    }

    De_node *fst, *snd, *lin = new De_node();

    for(int i = 0; i < Size - 1; i++){
        lin = head;
        fst = lin->next;
        snd = fst->next;

        for(int j = Size - i - 1; j > 0; j--){
            if(fst->val > snd->val){
                fst->next = snd->next;
                if(snd->next != nullptr){
                    snd->next->prev = fst;
                }
                snd->prev = fst->prev;

                if(fst->prev != nullptr){
                    fst->prev->next = snd;
                }

                if(snd->prev == nullptr){
                    head = snd;
                }else{
                    snd->prev->next = fst;
                }

                fst->prev = snd;
                snd->next = fst;

                lin = snd; // 更新 lin
            }else{
                lin = fst; // 不需交换时更新 lin
            }

            fst = lin->next;
            if(fst != nullptr){
                snd = fst->next;
            }
        }
    }

    delete lin;
}

这里,我们添加了一些额外的代码来更新链接的正确顺序,并且在进行节点交换时更新了 head 指针。请确保该程序中的链表操作符合你的实际需求,并将其与你的其他代码进行整合。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^