В настоящее время я читаю книгу о структурах данных и изучаю C++ на стороне. Я пытаюсь реализовать простой связанный список. Ниже приведен код для списка, который может принимать максимум два элемента (чтобы изолировать мою проблему). Неправильно это объявление указателя на следующий узел в списке. Когда я создаю новый экземпляр Node
и создаю указатель на него, указатель остается неизменным при каждом вызове метода, поэтому все элементы в списке указывают на один и тот же узел. Однако, если я создаю указатель напрямую, все работает так, как ожидалось.Локальная переменная, переписанная при каждом вызове метода
Я предполагаю, что у меня есть фундаментальное непонимание указателей, ссылок и ключевое слово new
.
Не стесняйтесь запускать приведенный ниже код. Рабочий код закомментирован.
#include <iostream>
using namespace std;
template <typename T> class Node {
public:
Node(T nvalue) {
this->value = nvalue;
this->next = NULL;
}
T value;
Node *next;
};
template <typename T> class LinkedList {
public:
Node<T> *head;
LinkedList() {
this->head = NULL;
}
void append(T newVal) {
// Correct
// Node<T>* newNode_ptr = new Node<T>(newVal); // newNode_ptr is different on each call
// Incorrect!?
Node<T> newNode = Node<T>(newVal);
Node<T> * newNode_ptr = &newNode; // newNode_ptr is the same on each call
cout << "New Node Address: " << newNode_ptr << endl;
if (!(this->head)) {
this->head = newNode_ptr;
cout << "Value 0: " << this->head->value << endl;
} else {
this->head->next = newNode_ptr;
cout << "Value 0: " << this->head->value << endl;
cout << "Value 1: " << this->head->next->value << endl;
}
}
};
int main() {
LinkedList<int> list = LinkedList<int>();
list.append(21);
cout << "..." << endl;
list.append(42);
}
Обратите внимание, что этот код не совсем хорошо продуман (некоторые вещи должны быть частными, using namespace std
следует избегать). Я знаком с python, поэтому этот материал указателя немного ошеломляет. Заранее спасибо за помощь!
*** Узел * newNode_ptr = & newNode; *** Будет определено поведение, когда 'newNode' выходит из области видимости. –
drescherjm
@drescherjm они выходят из области видимости вместе, поэтому я не вижу проблемы – user
Небольшой совет - при создании структуры данных сначала создайте ее для определенного типа или типа. Только когда у вас есть эта работа и тестирование, превратите ее в шаблон. –