将元素添加到 c 中列表开头的代码 - 错误是什么?

Code to add element to the beginning of a list in c - what's the error?

有人告诉我这将无法正确地将节点添加到列表中,但我已经对其进行了测试并且它似乎可以工作。任何人都可以让我知道这段代码中有什么不正确的地方吗?

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

void add_first(struct node* head, struct node* new_node) {
   new_node->next = head;
   head = new_node;
}

我要回答的确切问题是:

a) 该函数将无法给出预期的结果(即添加节点)。问题是什么,何时发生?

为了找出问题所在,我创建了四个节点,对它们使用了 add_first 函数,然后显示了结果。不过,我似乎得到了正确的输出。下面是我写的整体程序,不包括上面的功能:

void display(struct node* head) {
    printf("%d   ", head->num);
    if(head->next == NULL) {
        return;
    }
    display(head->next);
}

int main() {
    struct node* n1;
    struct node* n2;
    struct node* n3;

    n1 = (struct node*)malloc(sizeof(struct node*));
    n2 = (struct node*)malloc(sizeof(struct node*));
    n3 = (struct node*)malloc(sizeof(struct node*));

    n1->num = 1;
    n2->num = 2;
    n3->num = 3;

    add_first(n1, n2);
    add_first(n2, n3);

    display(n3);

    return 0;
}

我得到的输出是:

3 2 1

这似乎是正确的。那么,如果我得到了正确的输出,为什么函数不能给出预期的结果呢?我看不出有什么问题。

add_first(node,NULL) 将擦除头指针数据并给你错误。

第二种情况如果 head 为 NULL add_first(NULL,node);

函数和测试程序不正确。

节点n1应该是头部吧?但是,您正在显示传递节点 n3 而不是节点 n1.

的头部的列表

实际上你建立了一个列表,其头部是n3,n2和n1被添加到列表的尾部。

函数的问题

void add_first(struct node* head, struct node* new_node) {
   new_node->next = head;
   head = new_node;
}

是指向节点head的指针是传值的。所以这个声明

head = new_node;

处理原始头部的副本n1。实际上函数没有变化n1.

你必须通过引用传递 n1 的头部。

一个正确的代码至少可以看起来像

void add_first( struct node **head, struct node *new_node ) 
{
   new_node->next = *head;
   *head = new_node;
}

考虑到您必须将添加节点的下一个数据成员设置为 NULL。这主要是你必须为每个创建的节点编写

n1->num = 1;
n1->next = NULL;
n2->num = 2;
n2->next = NULL;
n3->num = 3;
n3->next = NULL;

函数本身将被调用为

add_first( &n1, n2 );

add_first( &n1, n3 );

在这种情况下,可以正确调用函数 display 并将实际头部传递给它

display( n1 );

考虑到像这样的陈述

n1 = (struct node*)malloc(sizeof(struct node*));
                                        ^^^^^

无效。您必须自己分配节点而不是指针,即

n1 = (struct node*)malloc(sizeof(struct node ));
                                        ^^^^