我附加在head_insert
的代码下面,在链表的头部插入一个新节点。该函数使用head_insert(head)
调用。
我不确定该函数的第一个参数的语法,我期待NodePtr
,因为它已经是指针,见下文。
为什么代码只使用NodePtr &head
而不是NodePtr head
,因为head已经是指针?
void head_insert(NodePtr & head, int the_number)
{
NodePtr temp_ptr;
temp_ptr=new Node;
temp_ptr->data=the_number;
temp_ptr->link=head;
head=temp_ptr;
}
struct Node
{
int data;
Node *link;
};
typedef Node* NodePtr;
答案 0 :(得分:4)
为什么代码使用“NodePtr& head”而不是“NodePtr head”只是因为head已经是指针?
原因是它需要函数对head
进行的任何更改才能对调用者可见。
如果head
按值(NodePtr head
)而不是按引用(NodePtr& head
)传递,则不会出现这种情况:当函数将temp_ptr
分配给head
时head
,此更改不会传播回调用方。通过引用传递{{1}}可解决此问题。
答案 1 :(得分:0)
乍一看你的typedef有点令人困惑。在C中,您应该传递struct Node ** head
参数并将其值分配给新创建的节点:*head = temp_ptr;
。这是它的样子:
void head_insert(struct Node **head, int the number)
{
struct Node *new_head = NULL;
// Alloc memory for new_head, etc..
new_head->data = the_number;
new_head->link = *head;
*head = new_head;
}
因此,要进行赋值*head = new_head
,您需要有一个指向列表头的指针,它也是一个指针。否则,在函数中执行的更新将保持本地。在你的代码中,你引用了一个指针,它与传递“双”指针的效果相同。