2016-10-31 3 views
0

У меня есть простой метод destructor, который разрушает каждый узел, но у меня возникают некоторые проблемы. Всякий раз, когда я пытаюсь удалить элемент из связанного списка, элемент удаляется, но затем удаляются все следующие элементы. Моя программа вылетает, если я пытаюсь распечатать или добавить несколько элементов. После его сбоя мой текстовый редактор выделяет мой метод PrintNode.Сбой связанного списка при уничтожении узлов

Вот мой destructor метод:

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(); 
    } 
} 

Почему мой деструктор приводит к сбою моей программы?

+0

ли вы отладки кода? Ваш деструктор вызывает 'delete next', который вызывает деструктор' next', который вызывает 'delete next;', который вызывает деструктор 'next', который вызывает' delete 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; 
    } 
} 
Смежные вопросы