C связанные списки, вставляющие узел, предыдущая инициализация узла

#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 в коде?

Для этого нет причин.

Разве одного раза было бы недостаточно?

ДА.