【发布时间】:2021-07-07 13:55:03
【问题描述】:
我有这段代码在最前面创建新节点:
void push(struct Node** head_ref, int new_data)
{
struct Node* new_node = (struct Node*) malloc(sizeof(struct Node));
new_node->data = new_data;
new_node->next = (*head_ref);
(*head_ref) = new_node;
}
我有这段代码在另一个节点之后创建一个新节点:
void insertAfter(struct Node* prev_node, int new_data)
{
if (prev_node == NULL)
{
printf("the given previous node cannot be NULL");
return;
}
struct Node* new_node =(struct Node*) malloc(sizeof(struct Node));
new_node->data = new_data;
new_node->next = prev_node->next;
prev_node->next = new_node;
}
我知道如果我们在第一种情况下传递一个单独的指针 a.k.a.head,则更改将仅在 push 函数中生效,而不是在整个程序中生效。这就是为什么我们使用对head 的引用来更改它所指向的内容。
不过,在第二种情况下,我们传递了一个指针。我只是不明白为什么当我们不使用对前一个节点的引用时,即使我们将 next 更改为指向新节点,代码仍然可以工作。
这些更改不应该只保留在insertAfter 函数中吗?
【问题讨论】:
-
你可以写
insertAfter和(struct Node** prev_node, ...,没问题。但是当您调用InsertAfter时,您实际上不需要修改调用方的prev_node.pointer。
标签: c pointers pass-by-reference singly-linked-list function-definition