Вставка в конец связанного списка. Почему S-узел становится нулевым при каждой вставке

#c

#c

Вопрос:

 void insertnode(node *s, int a)
{
    node *newnode = (struct node*)malloc(sizeof(struct node));
    newnode->data = a;
    newnode->next = NULL;

    if(s==NULL)
    {
        s = newnode;
    }
    else
    {  
        node *p = s;
        while(p->next!=NULL)
        {
             p=p->next;
        }
        p->next = newnode;
   }
}
int main()
{
    node *s;
    insertnode(s,5); //inserting element at the end

    insertnode(s,10); //inserting element at the end
    return 0;
}

  

Не в состоянии понять, почему s по-прежнему равен нулю при каждой
вставка. Печать после вставки не приводит к выводу.
Простите, что задаю сомнения новичкам

Комментарии:

1. Неопределенное поведение. s не инициализируется перед использованием, помимо всех других проблем, здесь.

Ответ №1:

s равен нулю после каждой вставки, потому что ваш код s = newnode устанавливает локальному s указателю новое значение, которое не обновляет содержимое исходного указателя в main() . Вы могли бы либо insertnode() вернуть s указатель (например, s = insertnode(s,5) не рекомендуется), либо main() создать контрольный узел в качестве заполнителя начала списка, который вы затем передаете insertnode() при первом обращении к нему (рекомендуется).