我有一個鏈接列表的合併實現。它接受兩個類型爲List的參數,它是一個包含Node* head
指針的類和包含typename T data
和Node* next
的結構Node
。我遇到的問題是我的實現沒有按照它應該的方式鏈接節點,或者我只是在錯誤地解決問題。它需要做的是,如果你做list1.merge(list2, list3);
那麼list1將成爲list2和list3節點的組合。我需要通過指針操作來做到這一點,並沒有新的內存分配,所以list2和list3將被修改。以下是我現在所擁有的:鏈接列表合併兩個列表,調試斷言錯誤
template <typename T>
void List<T>::merge(List& list1, List& list2) {
typename List<T>::Node* list1Ptr = list1.head;
typename List<T>::Node* list2Ptr = list2.head;
for(;;) {
if (list1Ptr == NULL && list2Ptr != NULL) {
list1Ptr = list2Ptr->next;
head = list1.head;
break;
}
else if (list2Ptr == NULL && list1Ptr != NULL) {
list2Ptr = list1Ptr->next;
head = list1.head;
break;
}
else if (list1Ptr == NULL && list2Ptr == NULL) {
head = list1.head;
break;
}
else if (list1Ptr != NULL && list2Ptr != NULL) {
if (list1Ptr->data > list2Ptr->data){
typename List<T>::Node* temp;
temp = list2Ptr->next;
list1Ptr->next = list1Ptr;
list2Ptr = temp;
}
else if (list1Ptr->data < list2Ptr->data) {
typename List<T>::Node* temp;
temp = list1Ptr->next;
list1Ptr->next = list2Ptr;
list1Ptr = temp;
}
else if (list1Ptr->data == list2Ptr->data) {
list1Ptr = list1Ptr->next;
}
}
}
}
將包含在該節點是已爲我們提供了一個類類型,它包含了所有正確的重載運算符,我們需要的數據。整個代碼運行得很好,直到主要超出範圍,然後析構函數被調用以獲得剩餘內容,之後我得到一個Debug Assertion Failed Expression: _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)
。
我真的不知道如何去做這件事,我已經繪製了很多次,這一切似乎都對我有意義。如果任何人有任何提示讓我朝正確的方向,我將不勝感激。感謝大家的期待!
請檢查你是不是刪除兩次的東西(如節點)。在進行合併時,您不會爲list1創建新對象,因此您可能正在嘗試刪除list1,list2和list3。 – asalic