2016-10-31 2 views
0

간단하게 destructor 메서드를 사용하여 각 노드를 파괴하지만 몇 가지 문제가 있습니다. 연결된 목록에서 항목을 제거하려고하면 해당 요소는 제거되지만 다음 요소도 모두 제거됩니다. 인쇄하거나 더 많은 요소를 추가하려고하면 프로그램이 중단됩니다. 충돌이 발생하면 내 텍스트 편집기에 내 PrintNode 메서드가 강조 표시됩니다.노드를 파괴 할 때 연결된 목록 프로그램이 충돌 함

Node::~Node() { 
    delete next; 
} 

나는이 방법을 사용하여 내 목록에서 요소를 제거하고 :

Node*Node::DeleteNode(Node *head, string a) { 
    if (head == NULL) return head; 
    head->next = DeleteNode(head->next, a); 
    if (head->get()==a) { 
     Node* temp = head->next; 
     next = NULL; 
     delete head; 
     return temp; 
    } 
    else { 
     return head; 
    } 
} 

그리고 나는 간단한 인쇄 할 :

void Node::PrintNode() { 
    cout << name << endl; 
    if (next) { 
     next->PrintNode(); 
    } 
} 

을 여기

destructor 방법 소멸자가 내 프로그램을 중단시키는 이유는 무엇입니까?

+0

당신이 당신의 코드를 디버깅나요? 소멸자는'delete next'를 호출합니다.이 함수는'next '를 호출하는'next'의 소멸자를 호출합니다.'next'를 호출하는'next'의 소멸자를 호출합니다. – PaulMcKenzie

+2

이것은 연결 목록을 구현하는 매우 어색한 방법입니다. 'Node' 클래스에는 사용자 정의 소멸자가 전혀 없어야합니다. 필요한 경우 링크 된 목록 코드에서 필요한 노드를 자동으로 삭제하지 마십시오. 단일 노드를 목록에서 제거하려면 어떻게해야합니까? 어떻게 소멸자가있는'Node' 클래스로 그렇게 할 것을 제안합니까? – PaulMcKenzie

+0

"목록에서 단일 노드를 제거하려면 어떻게해야합니까?" 그게 내 문제 같아. –

답변

0

노드를 삭제하면됩니다. 노드에 대한 링크가 아닙니다. 이것을하십시오.

delete head; 
head=NULL; 

다음을 제거하십시오. 다음으로 삭제하십시오.

소멸자에서

, 비어 남아 있어야, 컴파일러는 너무 라인

head=NULL; 

쓰기는 를 사용할 때 삭제를 호출하고 노드를 삭제하지만 당신은 또한 노드 대한 링크를 제거해야합니다

delete head; 
+0

방금 ​​시도했지만 여전히 충돌합니다. –

+0

내 대답을 업데이트했습니다. – suleman

+0

DeleteNode 함수에서 이것을 시도하고 비어있는 소멸자로 남아 있습니다. – suleman

0

우선 검색 문자열이 첫 번째 노드에 있더라도 항상 n 개의 재귀 호출과 n 개의 할당이 있습니다.

Node*Node::DeleteNode(Node *head, string a) { 
    if (head == NULL) return head; 
    head->next = DeleteNode(head->next, a); // n calls, n assignments 
    if (head->get()==a) { 
     Node* temp = head->next; 
     next = NULL; 
     delete head; 
     return temp; 
    } 
    else { 
     return head; 
    } 
} 

문제는 아마 여기에 있습니다 :

Node::~Node() { 
    if(next) { 
    delete next; 
    } 
} 
관련 문제