Добавление узла в конец связанного списка, но невозможность доступа к последнему узлу

#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 is nullptr , поэтому final test не печатается.

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. Хороший. Я также понял, что это предотвратит такие ошибки по своей сути.