Я пытаюсь удалить дубликаты из связанного списка и столкнулся с проблемой, которая, вероятно, очевидна и понятна, но я не использовал C++
в течение многих лет, и я не мог узнать, что я делаю неправильно, чтение подобных вопросов на SO.
Ниже приведены части моего кода. Я удалил ненужные части (например, конструкторы, другие методы и т.д.).
template<class T>
class Node {
Node() : data(NULL), next(NULL), prev(NULL) {}
explicit Node(T d) : data(d), next(NULL), prev(NULL) {}
explicit Node(T d, Node<T> *nxt, Node<T> *prv) : data(d), next(nxt), prev(prv) {}
~Node() { delete next; delete prev; }
T data;
Node *next;
Node *prev;
};
template<class T>
class LinkedList {
LinkedList() : head(NULL) {}
explicit LinkedList(Node<T> *head_node) : head(head_node) {}
LinkedList& operator=(const LinkedList ©_list);
~LinkedList(); //didn't implement this but I guess delete head is all?
Node<T>* head;
};
template<class T>
LinkedList<T> RemoveDuplicates(const LinkedList<T> &linked_list) {
//my = overload creates a whole new list with the same data as the original one
LinkedList<T> result = linked_list;
Node<T> *cur = result.head;
Node<T> *prev = NULL;
while (cur) {
if (...) { //duplicate found
Node<T> *temp = cur;
prev->next = cur->next;
cur = cur->next;
cur->prev = prev;
free(temp); //Here is my problem!!!
}
else {
prev = cur;
cur = cur->next;
}
}
return result;
}
Итак, сначала я сделал delete temp
, и я получил Segmentation fault
. Тогда я понял, что вы только delete
, что вы new
. Достаточно справедливо, но я new
вводя каждый Node
при построении всего списка в main
:
Node<char> *h = new Node<char>('H'); //I have a constructor to handle this
Node<char> *e = new Node<char>('E');
Node<char> *l1 = new Node<char>('L');
Node<char> *l2 = new Node<char>('L');
Node<char> *o = new Node<char>('O');
h->next = e;
h->prev = NULL;
e->next = l1;
e->prev = h;
//and so on
Итак, почему мне не разрешено delete
что-то, что было new
ed где-то еще? Это потому, что он был new
ed за пределами текущей области?
Во-вторых, free
пространство работает отлично, но, очевидно, это не так, потому что я не malloc
, а new
ed!
Что я делаю неправильно? Как правильно удалить удаленный файл node?
Edit1: сделал это более наглядным в соответствии с ответами на мой пост Edit2: добавлено правило из 3 методов