не обращайте внимания на ответ, так как это c ++, исходный вопрос был помечен c ++
Исходный код, как только небольшие проблемы решены (фактическое распределение узла, установка значения, определение временного указателя, чтобы помочь пройти список), должно работать. Но есть и другие подходы, которые вы можете использовать для упрощения кода (ну, не то, чтобы он был чрезвычайно сложным), который в основном подразумевает нахождение точки вставки перед созданием, а затем создание нового элемента:
Node** insertPoint = &start;
while (*insertionPoint)
insertionPoint = &((*insertionPoint)->next);
*insertionPoint = new Node(value);
Используйте указатель на указатель, чтобы пройти по списку, инициализированный с адресом указателя головы, перемещайте его, пока он не обратится к Node*
, где будет добавлен новый элемент (примечание, добавлено, не вставлено). Затем создайте новый узел в этой позиции. Это предполагает, что конструктор Node
позаботится о копировании значения и инициализации указателя next
.
В качестве альтернативы вы можете написать это рекурсивно и позволить компилятору выполнить оптимизацию хвоста для вас (это может быть немного проще для чтения, некоторые люди находят рекурсию проще, некоторые нет):
void append( Node*& tail, Value value ) {
if ( tail==NULL )
list = new Node(value);
else
append( list->next, value );
}
Телефонный код:
append( start, 100 ); // assuming nits contained in the list
В этом случае вместо двойного указателя мы можем использовать ссылку на указатель, поскольку нам не нужно изменять его