C - 单链表 - 按值传递指针与按引用传递指针
C - Singly linked list - passing a pointer by value vs by reference
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**
(指向节点的指针的地址)。
- 对于
add_after()
参数给出了要修改的NODE地址。您不必修改该地址。
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**
(指向节点的指针的地址)。
- 对于
add_after()
参数给出了要修改的NODE地址。您不必修改该地址。