나는 연결된 목록에 대한 병합 구현이 있습니다. Node* head
포인터와 typename T data
및 Node* next
으로 구성된 Node
구조체를 포함하는 클래스 인 List 유형의 두 매개 변수를 허용합니다. 내가 가지고있는 문제는 내 구현이 노드를 연결하지 못하거나 어쩌면 내가 잘못 생각한 것입니다. 필요한 것은 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