2013-10-27 1 views
0

나는 연결된 목록에 대한 병합 구현이 있습니다. Node* head 포인터와 typename T dataNode* 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)이됩니다.

나는 이것에 대해 어떻게 해야할지 잘 모르겠다. 나는 여러 번 여러 차례 그렸고, 나에게 의미가있는 것처럼 보인다. 누구든지 나를 올바른 방향으로 인도 할 수있는 조언이 있으면 크게 감사 할 것입니다. 찾고있는 모두에게 감사드립니다!

예상대로이 작동하지 않습니다
+0

당신이 (노드와 같은)를 두 번 뭔가를 삭제하지 않는 확인하십시오 :
여기 당신이 사용하는 것이 좋습니다들의 유사 코드입니다. 병합을 수행 할 때 list1에 대한 새 객체를 만들지 않으므로 list1, list2 및 list3을 삭제하려고합니다. – asalic

답변

1

는 :

list1Ptr->data > list2Ptr->data && list1Ptr != NULL 
      && list2Ptr != NULL 

당신은 포인터가, 그렇지 않으면 당신은 정의되지 않은 동작을 얻을 것이다 그것을 역 참조하기 전에 NULL인지를 검사 할 필요가있다. (이는 아무 일도 일어나지 않을 수 있음을 의미합니다.) 또한 NULL 대신에 nullptr을 사용해야합니다.

다른 조건문의 모든 NULL 사례를 확인했기 때문에 오류 메시지의 원인이 아닙니다.

문제는 아마도 asalic으로 제안되었습니다. 의견을 보내려면 나머지 코드를 보여주십시오. 이 우선 여기에 뭔가 문제가 잘

1

:

if (list1Ptr == NULL && list2Ptr != NULL) { 
     list1Ptr = list2Ptr; 
     head = list1.head; 
     break; 
    } 

당신은 당신이 원하는 것은리스트 2를 가리 키도록 목록 1의 마지막 노드를 지적하는 것입니다 다음 목록 1을 통과 할 경우. list1Ptr = list2Ptr;
은 아무 것도 처리하지 않습니다. 단순히 지역 변수의 값을 변경하는 것입니다. 당신은 데이터가 확실하기 때문에 (문제가있을 것입니다> 널 (null) 종료에 액세스하려고하면 list1Ptr 다음 NULL이되면
list1Ptr->data > list2Ptr->data && list1Ptr != NULL && list2Ptr != NULL
:이 일을 사물의 나쁜

else if (list2Ptr == NULL && list1Ptr != NULL) { 
     list2Ptr = list1Ptr; 
     head = list1.head; 
     break; 
    } 

:이 부분에 대한 동일
일반적으로 표현식은 왼쪽에서 오른쪽으로 실행됩니다). 또한
:

여기 너무 정말 문제가 있습니다
 else if (list1Ptr->data > list2Ptr->data && list1Ptr != NULL 
      && list2Ptr != NULL) { 
     typename List<T>::Node* temp = list2Ptr; 
     list2Ptr = list2Ptr->next; 
     temp->next = list1Ptr; 
     } 

. 먼저 list2ptr을 임시로 저장하십시오. 그런 다음 list2ptr을 list2의 다음 노드로 이동합니다. 그런데 왜 temp->next = list1ptr을 만드나요?
다시 생각해 보셔야합니다. 다음 블록에 대해서도 마찬가지입니다.
최고.
편집 :
좋아,하자가 할 수있는 무엇을 더 보자 :

func(list1,list2): 
ptr1 = list1.head 
ptr2 = list2.head 
declare pointer curr 
if(ptr1!= NULL and ptr2!=NULL){ 
    if(ptr1->data < prt2->data) 
    {curr = ptr1 
    ptr1 = ptr1->next 
    head = curr 
    } 
    else{ 
    curr = ptr2 
    ptr1 = ptr2->next 
    head = curr}} 
else{ 
    head = whichever one is not NULL, or NULL if both of them are and return 
    } 
while(ptr1 != NULL and ptr2!=NULL){ 
    if(ptr1->data < ptr2->data){ 
    curr->next = ptr1 
    curr = ptr1 
    ptr1 = ptr1->next 
    continue} 
    else{ 
    curr->next = ptr2 
    curr = ptr2 
    ptr2 = ptr2->next 
    continue} 
} 
if(ptr1 == NULL) 
    curr->next = ptr2 
else 
    curr->next = ptr1 
+0

고마워, 나는 마음에 그 끝을 확실히 그것으로 작동합니다! – floatfil

+0

몇 가지 변경 사항을 적용했지만 변경 사항이 많아도 여전히 동일한 작업을 수행하고있는 것으로 보입니다. 일부 couts을 사용하여 디버깅 한 결과 두 목록을 병합하거나 다른 목록을 병합 된 목록으로 설정하지 않는 것으로 보입니다. – floatfil

+0

@floatfil 좋아, 가짜 코드가 추가되어 도움이 될 것입니다. – digvijay91