我有一个链接列表的合并实现。它接受两个类型为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