[英]Why do I get a segmentation fault here?
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;
}
}
一切似乎都正常,期待這個 function。 我總是遇到分段錯誤,我很困惑為什么會發生這種情況。
另外,我在上大學,所以可能有更有效的方法,但這是我可以做到的方式,無需提前了解課程。
我有一個名為 length 的變量來保存長度。 那部分是老師實施的。
所以它給了我這個錯誤: Thread 1: EXC_BAD_ACCESS (code=2, address=0x7ffeef3ffff8)
。 如何通過 code=2 和其他數字找出錯誤的含義?
有概率。 很多事情都錯了。 這顯示了如何使用std::list
來完成。 我不知道是否給出了 API,但讓我們將其分開 function 以獲取列表。
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 );
我們完成了。 在此處查看工作版本
for(int i=0;i<getLength()/2;i++)
我有一個名為 length 的變量來保存長度。 那部分是老師實施的。
因此, getLength()
是LinkedList
的成員 function 。 當我們進行遞歸調用時,它總是會告訴我們整個LinkedList
的存儲length
。 但這不是我們想要的——我們想要傳入的Node
鏈中的節點數。相反,當我們第一次進行遞歸調用時,我們嘗試將其拆分為與它已有的相同數量的節點(前半部分,后半部分為零節點)。 由於這沒有任何進展,我們最終將通過遞歸調用來炸毀堆棧。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.