为什么在这里会出现细分错误?

时间:2020-04-20 21:23:24

标签: c++ c++11 linked-list nodes mergesort

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和其他数字找出错误的含义?

2 个答案:

答案 0 :(得分:3)

有概率。许多事情错了。这显示了如何使用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。

    mergesort( list );
    mergesort( other );

部分结果需要合并。

    list.merge( other );        

我们完成了。查看工作版本here

答案 1 :(得分:1)

for(int i=0;i<getLength()/2;i++)

我有一个名为length的变量,它保存长度。这部分是由老师实施的。

因此,getLength()LinkedList的成员函数。当我们进行递归调用时,它将始终告诉我们整个length中存储的LinkedList。但这不是我们想要的-我们希望传入的Node链中的节点数。相反,第一次进行递归调用时,我们尝试将其拆分为相同数量的节点就像已经有的一样(在上半部分,在下半部分为零节点)。由于没有任何进展,我们最终将通过递归调用炸毁堆栈。