#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;