gpt4 book ai didi

C - 单链表 - 按值传递指针与按引用传递指针

转载 作者:行者123 更新时间:2023-11-30 15:19:37 26 4
gpt4 key购买 nike

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

NODE* add_head(NODE **phead, int data) {
NODE *new = (NODE *)malloc(sizeof(NODE));
new->data = data;
new->next = *phead;
*phead = new;
return new;
}

NODE* add_tail(NODE **phead, int data) {
NODE *p, *new = (NODE *)malloc(sizeof(NODE));
new->data = data;
new->next = 0;
if (*phead == 0) *phead = new;
else
{
for (p = *phead; p->next; p = p->next);
p->next = new;
}
return new;
}

我们有一个单链表,如上面的函数所示。该节点由数据类型 int 和指向列表中下一个节点的指针组成。我们定义了两个函数。第一个更改头节点,或将新的头节点添加到前一个头节点之前。第二个函数添加尾节点(列表中的最后一个)。总的来说,我们这样调用它们:

NODE *head = 0;
NODE *c1 = add_head(&head, 1);
NODE *c2 = add_tail(&head, 3);

现在,看看这个函数:

NODE* add_after(NODE *node, int data) {
NODE *new = (NODE *)malloc(sizeof(NODE));
new->data = data;

new->next = node->next;
node->next = new;

return new;
}

该函数在参数节点后添加一个节点。并且,在 main 中,如果我们想在先前定义的 c1 之后添加一个节点,我们调用如下函数:

*c3 = add_after(c1, 4);

我的问题是:前两个函数和第三个函数在参数方面有什么区别。在前两个函数中,我们有一个参数 **phead,在第三个函数中,我们有一个参数 *node。我们真的需要 **phead 吗?为什么我们不能直接把 *phead 放在 main 中,像这样调用它:

NODE *c1 = add_head(head, 1);

希望你明白我的意思,我觉得很难解释。

最佳答案

  • 第一个元素(NODE 类型)的地址包含在指针(NODE * 类型)中

  • add_head() 函数修改此指针。当您使用 C 进行编程时,明显缺乏按引用传递参数,因此您唯一的选择就是传输其地址。

因此,参数的类型为NODE**(指向NODE的指针的地址)。

  • 对于add_after(),参数给出要修改的NODE的地址。您不必修改该地址。

关于C - 单链表 - 按值传递指针与按引用传递指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30556796/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com