Связанный список создание нового указателя для добавления значения, но не работает

#c #loops #pointers #linked-list #add

Вопрос:

 void List::add_item(double new_value)
{
    if (list == nullptr)
    {
        list = new ValueList;
        list->value = new_value;
        list->next = nullptr;
    }
    else
    {
        ValueList* track = list;
        while (track != nullptr)
        {
            track = track->next;
        }
        track = new ValueList;
        track->value = new_value;
        track->next = nullptr;
    }
    size  = 1;
}
 

С помощью следующего кода выше я пытаюсь добавить новое значение в связанный список, прокручивая связанный список до тех пор, пока он не достигнет конца списка, а затем создать динамическую переменную для хранения этого значения в связанном списке.

Однако я не понимаю, почему это не происходит, когда я вывожу связанный список. Он показывает только последний элемент в списке. Означает ли это, что трек на самом деле указывает на список, и когда я выполняю цикл, например, трек = трек->далее, список также меняется? Что для меня вообще не имеет смысла.

Комментарии:

1. Да, это не работает, и очень легко понять, почему это не работает, просто наблюдая простой факт, что нигде нет строки кода, которая указывала next бы указатель последнего узла в исходном связанном списке на новый узел. Вы new следующее значение в той else части, верно? Но где код, который устанавливает указатель последнего узла next на узел new ed? P.S. Эта операция не должна занимать более четырех или пяти строк кода и без использования какого-либо if оператора. Это просто излишне усложняет дело.

2. Я думаю, что следующее значение уже определено, поэтому я непосредственно изменяю само значение на следующее. Я думаю, что если list == nullptr и в него можно внести изменения, то почему бы и нет, если track == nullptr? Я все еще перевариваю реализацию связанного списка

3. Это не так, как это работает. Если вы достанете яблоко из левого кармана, положите его на стол и разрежете ножом, у вас в левом кармане не окажется нарезанного яблока. Если вы скопируете a nullptr в переменную, а затем установите эту переменную на что-то другое, откуда бы вы ни скопировали переменную, она также не станет чем-то другим. C так не работает.

4. оооо, я понимаю, что ты имеешь в виду. Если я правильно понимаю это, это потому, что трек является переменной, поэтому, когда я устанавливаю его равным новому списку переменных, это означает, что он отделяется от связанного списка, который я установил для отслеживания. Вот почему связанный список не подключается к новым значениям?

5. @swittuh вы можете значительно упростить этот код, чтобы иметь ту семантику, которую вы изначально предполагали. Вам просто нужно использовать дополнительный уровень косвенного указания указателя, например: void List::add_item(double new_value) { ValueList** track = amp;list; while (*track != nullptr) { track = amp;((*track)->next); } *track = new ValueList{new_value, nullptr}; size = 1; }

Ответ №1:

Потому что вы проходите мимо последнего элемента. На самом деле вы должны проверить nullptr , есть ли следующий элемент, а не тот, на котором вы находитесь nullptr .

 while (track != nullptr)
{
   track = track->next;
}
 

должно быть:

 while (track->next != nullptr)
{
   track = track->next;
}

track->next = new ValueList;
track->next->value = new_value;
track->next->next = nullptr;