У меня есть задание, которое требует от нас реализации класса двусвязного списка. По какой-то причине они определили узел struct следующим образом:
struct node {
node *next;
node *prev;
T *o;
};
Мне кажется, что было бы намного проще написать класс, если бы член структуры data не был указателем. Излишне говорить, что я не могу это изменить, поэтому мне придется просто обойти это. Я попытался реализовать метод, который добавляет элемент в начало списка следующим образом:
template <typename T>
void Dlist<T>::insertFront(T *o) {
node *np = new node;
T val = *o;
np->o = &val;
np->prev = NULL;
np->next = first;
if (!isEmpty()) {
first->prev = np;
} else {
last = np;
}
first = np;
}
При использовании ddd для отладки я понял, что все работает нормально в первый раз, когда вы вставляете число, но во второй раз все оказывается напортаченным, поскольку как только вы устанавливаете 'val' в новый элемент, он "перезаписывает" первый, так как память был использован адрес val. Я пробовал делать другие вещи, например, вместо того, чтобы просто использовать переменную val, чтобы сделать следующее:
T *valp = new T;
T val;
valp = &val;
val = *o;
np->o = valp
Это тоже не сработало. Я думаю, это потому, что это просто более сложная форма того, что я сделал выше, только с дополнительной утечкой памяти :)
Любые идеи / указатели в правильном направлении были бы замечательными.