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和其他数字找出错误的含义?
答案 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
链中的节点数。相反,第一次进行递归调用时,我们尝试将其拆分为相同数量的节点就像已经有的一样(在上半部分,在下半部分为零节点)。由于没有任何进展,我们最终将通过递归调用炸毁堆栈。