#c #linked-list
#c #связанный список
Вопрос:
У меня возникли проблемы с добавлением нового узла в конец односвязного списка.
Когда я распечатываю список, я, похоже, не могу получить доступ к последнему узлу.
if (head == nullptr)
{
head = newNode;
}
else
{
record* current = head;
while (current->next != nullptr)
{
current = current->next;
}
current->next = newNode;
}
//Writing data to record.
newNode->name = name;
newNode->highscore = highscore;
newNode->initials = initials;
newNode->plays = plays;
newNode->revenue = revenue;
record* test = head;
while (test->next != nullptr)
{
cout << test->name << endl;
test = test->next;
}
Комментарии:
1. Сохранение хвостового указателя сделало бы это намного проще. Код, специфичный для хранимых данных, вообще не должен находиться в вашем классе List. Список является контейнером, он не должен быть адаптирован к каким-либо конкретным данным. Конкретная проблема, с которой вы сталкиваетесь, — это простое отключение. Ваш цикл печати завершается, когда
test->next
isnullptr
, поэтому finaltest
не печатается.2. После строки
current->next = newNode;
вамnewNode->next = nullptr
также нужно написать.
Ответ №1:
Вам нужно добавить nullptr
после добавления нового узла в список. Кроме того, вы должны распечатать список, пока не достигнете nullptr
if (head == nullptr)
{
head = newNode;
}
else
{
record* current = head;
while (current->next != nullptr)
{
current = current->next;
}
current->next = newNode;
newNode->next = nullptr;
}
//Writing data to record.
newNode->name = name;
newNode->highscore = highscore;
newNode->initials = initials;
newNode->plays = plays;
newNode->revenue = revenue;
record* test = head;
while (test != nullptr)
{
cout << test->name << endl;
test = test->next;
}
Комментарии:
1. Предположительно, можно было бы инициализировать поля
newNode
, в том числеnext
, перед попыткой вставкиnewNode
в список, а не после .
Ответ №2:
Хотя другой ответ хорош и необходим, я думаю, что его можно обработать более простым способом. Вот пример Node
.
struct Node {
int data;
Node* next = nullptr;
Node(int val) : data(val) {}
}
По умолчанию — инициализируя указатель на nullptr
, вам не нужно постоянно беспокоиться об этом на протяжении всей реализации класса list . Для каждого объявленного Node
автоматически устанавливается указатель на nullptr
для вас.
Комментарии:
1. Хороший. Я также понял, что это предотвратит такие ошибки по своей сути.