头节点未在范围外更新 [单链表]

Head Node not updated outside Scope [Single Linked List]

我已经解释了我目前卡在底部的位置。

下面这个结构是我的节点.

struct node {
    int data;
    struct node *next;
}

struct node *head;

我已经为头节点分配了内存。

head = malloc(sizeof(struct node));

并通过

创建了一堆链接到它的其他节点
struct node *temp;
for (int i=0; i < no_of_nodes - 1; i++)
    {
        struct node *n = malloc(sizeof(struct node));
        temp -> next = n;
        printf("Enter Node %d data : ", i+1);
        scanf("%d", &(n -> data));

        temp = n;
    }
    temp -> next = NULL; 

然后我的 printNodes 函数

void printNodes(struct node *n)
{
    //printf("%d", n -> data);
    while(n != NULL)
    {   
        if (n -> next != NULL)
            printf("%d%s", n -> data, " -> ");
        else
            printf("%d%s", n -> data, " -> NULL\n");
        n = n->next;
    }
}

输出如下:6 -> 7 -> 8 -> 9 -> 3 -> NULL

现在,我试图在头节点插入一个节点,即它成为头节点,原来的头成为第二个节点。

printf("Enter the head position (obviously 0) : ");
scanf("%d", &pos);
insertNode(head, pos);
printNodes(head);

插入节点函数:

void insertNode (struct node *head, int pos)
{
    struct node *n;
    n = malloc(sizeof(struct node));
    printf("Enter the Node data : ");
    scanf("%d", &(n -> data));

    if (pos == 0)
    {
        printf("Pos was 0, so HEAD\n");
        n -> next = head;
        head = n;
        printNodes(head);
    }
}

好的,所以问题是,printNodes(head) 实际上按预期打印了.. 但是 printNodes(head);after insertNodes(head, pos) 不打印更新的链表, 为什么头部没有更新? 我哪里做错了?

我得到的输出是, 输出:

输入Head位置(显然是0):0

输入节点数据:34

Pos 为 0,所以 HEAD

34 -> 6 -> 7 -> 8 -> 9 -> 3 -> NULL [from printNodes(head) inside insertNodes(head, pos)]

6 -> 7 -> 8 -> 9 -> 3 -> NULL [from printNodes(head) after insertNodes(head, pos)]

如果有人想看完整代码, here你去吧

感谢任何帮助.. 提前谢谢你。

函数insertNode按值接受指向头节点的指针。也就是说,它处理指向头节点的原始指针值的副本。更改副本不会反映在原始指针上。原指针保持不变

您需要通过引用传递指针。

在 C 中,通过引用传递对象意味着通过指向它的指针间接传递对象。取消引用指针,您将直接访问引用的对象。

函数至少可以这样看

int insertNode( struct node **head, size_t pos )
{
    struct node *n = malloc( sizeof( struct node ) );
    int success = n != NULL;

    if ( success )
    {
        printf( "Enter the Node data : " );
        scanf( "%d", &n->data );

        while ( *head != NULL && pos-- )
        {
            head = &( *head )->next;
        }

        n->next = *head;
        *head = n;
    }

    return success;
}

并且该函数被调用为

insertNode( &head, pos );