class Node{
public:
int data;
Node* next;
Node(int data)
{
this->data = data;
this->next = NULL;
}
};
int main()
{
Node* node1 = new Node(12);
cout<< node1->data ;
return 0;
}
Не могу понять, почему мы создаем объект-указатель для узла (Node* node1)?
Спасибо, что развеяли мои сомнения заранее
Мы создаем это, чтобы мы могли провести базовый тест. ничего в main
не является частью связанного списка. main
предназначен только для демонстрации того, что это работает.
Ваш пример программы выглядит как пример того, как выделить и получить доступ к объекту Node
. Это как «Привет, мир» для Nodes. Сейчас в этом нет никакого смысла, но, скорее всего, вы вскоре будете использовать эти знания, когда дело дойдет до работы с несколькими узлами, объединенными в связанный список.
Связанный список — это «горбовая миссия» для новых программистов, которая вымывает многих из них. Приятно видеть, как люди втягиваются в это.
Примечание: во многих случаях конструктор был бы лучше, чем Node(int data): data(data), next(nullptr) { }
. Это не имеет большого значения для int
s и указателей, инициализация по умолчанию для них ничего не делает, но поскольку все базовые классы и члены должны быть инициализированы до входа в тело конструктора, часто дублируется работа по инициализации члена, а затем присвоение ему правильного значения внутри тела.
Коду в main()
нужен указатель просто потому, что именно его возвращает new
. Код создает объект Node
в динамической памяти в куче (и, следовательно, его утечка, поскольку перед оператором delete node1;
нет оператора return
).
Вместо этого вы можете создать объект в автоматической памяти в стеке и, следовательно, не нуждаться в указателе, например:
int main()
{
Node node1(12);
cout << node1.data;
return 0;
}
Как правило, связанные списки создаются с использованием динамической памяти, чтобы новые узлы можно было добавлять в список динамически, например, в цикле или в ответ на ввод данных пользователем и т. д.
В этом нет смысла. Лучше бы он не был указателем.