#c #linked-list #insert #nodes #nullptr
#c #связанный список #вставить #узлы #nullptr
Вопрос:
Я просматривал в своем учебнике по C пример функции связанного списка для вставки нового узла в список, который приведен ниже….
Void NumberList::insertNode(double num)
{
ListNode *newNode; //A new node
ListNode *nodePtr; //To transverse the list
ListNode *previousNode = nullptr; //The previous node
//Allocate a new node and store num there
newNode = new ListNode;
newNode->value = num;
//If there's no nodes in the list, make newNode the first node
if (!head)
{
head = newNode;
newNode->next = nullptr;
}
else //Otherwise, insert newNode
{
//Postion nodePtr at the head of the list
nodePtr = head;
//Initialize previousNode to nullptr.
previousNode = nullptr;
//Skip all nodes whose value is less than num.
while (nodePtr != nullptr amp;amp; nodePtr->value < num)
{
previousNode = nodePtr;
nodePtr = nodePtr->next;
}
//If the new node is the 1st in the list, insert it before all other nodes
if (previousNode == nullptr)
{
head = newNode;
newNode->next = nodePtr;
}
else //Otherwise insert after the previous node
{
previousNode->next = newNode;
newNode->next = nodePtr;
}
}
}
`
Мне было интересно, почему previousNode дважды инициализируется в nullptr в коде? Разве одного раза было бы недостаточно?
Другое дело, может ли кто-нибудь привести мне пример того, как мы будем вставлять узел в список, если хранимые данные представляют собой символ или строку? Поскольку в цикле while в этом примере указывается, что данные в узле должны быть меньше, чем данные, передаваемые функции.
Спасибо.
Ответ №1:
Мне было интересно, почему previousNode дважды инициализируется в nullptr в коде? Разве одного раза было бы недостаточно?
Один раз было бы хорошо. Второе назначение является избыточным.
Другое дело, может ли кто-нибудь привести мне пример того, как мы будем вставлять узел в список, если хранимые данные представляют собой символ или строку?
Вы бы написали тип узла, value
член которого мог бы хранить нужный вам тип (или использовать std::any
, или шаблон всего этого для сохраненного типа, как std::list
это делает).
Поскольку в цикле while в этом примере указывается, что данные в узле должны быть меньше, чем данные, передаваемые функции.
Это не то, что он делает:
//Skip all nodes whose value is less than num.
while (nodePtr != nullptr amp;amp; nodePtr->value < num) { ... }
сохраняет список отсортированным, выбирая позицию вставки на основе значения. «Пропустить все узлы» здесь означает «пройти мимо этих узлов, чтобы новый узел появился после них в списке»
Ответ №2:
Мне было интересно, почему previousNode дважды инициализируется в nullptr в коде?
Для этого нет причин.
Разве одного раза было бы недостаточно?
ДА.