Я только недавно попал в связанные списки, и я добавляю свою собственную функцию «добавить в конец».
void insert_at_end(Node** head, Node* node)
{
Node* temp;
temp = *head;
if (temp == NULL) // linked list is empty
{
*head = node;
}
else
{
while (temp->pNext != NULL)
{
temp = temp->pNext;
}
temp->pNext = node;
}
}
Первоначально я делал temp != NULL
вместо temp->pNext != NULL
, потому что я так думал, что это приведет меня к самому последнему узлу, так как он останавливает цикл, когда у temp все еще есть данные, прежде чем он достигнет NULL. Разве temp->pNext != NULL
не остановится на втором и последнем узле? Так как он останавливает зацикливание, когда понимает, что следующий указатель последнего узла равен NULL, он не перемещается на этот узел?
Спасибо, ребята, если мне нужно что-то прояснить из этого слова, рвота, дайте мне знать.
2 ответа
Разве
temp->pNext != NULL
не остановится на втором-последнем узле?
Нет. Вот графическое изображение для простоты понимания.
С temp != NULL
temp
будет указывать на NULL
:
+---+ +---+ +---+
| 1 |--->| 2 |--->| 3 |---> NULL
+---+ +---+ +---+ ^
|
temp
Как вы видите, temp
выполняет итерацию до тех пор, пока не станет NULL
, после чего вы не можете ничего присоединить к конечному узлу, потому что вы прошли его.
С temp->pNext != NULL
temp
будет указывать на последний узел.
+---+ +---+ +---+
| 1 |--->| 2 |--->| 3 |---> NULL
+---+ +---+ +---+
^
|
temp
Здесь temp
будет повторяться до следующего узла NULL
. Это означает, что вы указываете на последний узел, и вы можете использовать этот указатель, чтобы настроить этот узел так, чтобы он указывал на новый узел с temp->pNext = node
:
+---+ +---+ +---+ +---+
| 1 |--->| 2 |--->| 3 |--->| 4 |---> NULL
+---+ +---+ +---+ +---+
^
|
temp
Кроме того, вы можете также захотите добавить дополнительную безопасность, гарантируя, что узлу, которому вы дали очки, NULL
, в случае если вызывающая сторона может забыть это сделать. Это так же просто, как добавить эту строку в начало функции:
node->pNext = NULL;
Давайте проведем аналогию.
- Каждый узел - это станция.
NULL
ваша остановка.while (temp->pNext != NULL) { temp = temp->pNext; }
означает поездку и посещение каждой станции, пока не достигнете станции остановки.- Когда вы достигнете станции остановки,
temp->pNext = node;
необходимо добавить дополнительную станцию
Теперь прежняя остановочная станция, за которой следует новая добавленная остановочная станция (неявно новая NULL
) не остановочная станция, а предпоследняя станция, которую необходимо посетить.
Похожие вопросы
Новые вопросы
c
C - это язык программирования общего назначения, используемый для системного программирования (ОС и встраиваемых), библиотек, игр и кроссплатформенности. Этот тег следует использовать с общими вопросами, касающимися языка C, как это определено в стандарте ISO 9899 (последняя версия 9899: 2018, если не указано иное, а также для запросов, специфичных для версии, с c89, c99, c11 и т. Д.). C отличается от C ++ и не должен сочетаться с тэгом C ++ без разумной причины.