首页 > 解决方案 > 为什么我在这里遇到分段错误?

问题描述

void LinkedList<T>::mergeSort(Node*& curr) {
    if (curr->next != nullptr) { //Thread 1: EXC_BAD_ACCESS (code=2, address=0x7ffeef3ffff8)
        Node *ptr1 = nullptr;
        Node *ptr2 = curr;
        //splits linked list
        for (int i = 0; i < getLength() / 2; i++) {
            ptr1 = ptr2;
            ptr2 = ptr2->next;
        }
        ptr1->next = nullptr;
        ptr1 = curr;
        //recursive call for sorting
        mergeSort(ptr1); //Thread 1: EXC_BAD_ACCESS (code=2, address=0x7ffeef3ffff8)
        mergeSort(ptr2);
        //merge lists back together
        if (ptr1 == nullptr)
            curr = ptr2
        else if (ptr2 == nullptr)
            curr = ptr1

        Node *reff = ptr1;

        while (reff->next != nullptr) {
            reff = reff->next;
        }
        reff->next = ptr2;
        curr = reff;
    }
}

一切似乎都在工作,期待这个功能。我总是遇到分段错误,我很困惑为什么会发生这种情况。

另外,我在上大学,所以可能有更有效的方法,但这是我可以做到的方式,无需提前了解课程。

我有一个名为 length 的变量来保存长度。那部分是老师实施的。

所以它给了我这个错误:Thread 1: EXC_BAD_ACCESS (code=2, address=0x7ffeef3ffff8)。如何通过 code=2 和其他数字找出错误的含义?

标签: c++c++11linked-listnodesmergesort

解决方案


有概率。很多事情都错了。这显示了如何使用std::list. 我不知道是否给出了 API,但让我们让它成为一个单独的函数,它需要一个列表。

template<typename T>
void mergesort( std::list<T>& list ){

如果我们有多个元素,则只有工作要做

    auto const size = list.size();
    if( size > 1) {

然后将该列表拆分为两个列表。

        auto mid = list.begin();
        std::advance( mid, size/2 );        
        std::list<T> other;        
        other.splice( other.begin(), list, list.begin(), mid );

现在我们有两个子列表,可以在它们上递归调用合并排序。

    mergesort( list );
    mergesort( other );

然后需要合并部分结果。

    list.merge( other );        

我们完成了。在此处查看工作版本


推荐阅读