2

我附在下面的代码中,head_insert以在链表的头部插入一个新节点。使用 调用该函数head_insert(head)

我不确定函数的第一个参数的语法,我期待的NodePtr 是因为它已经是一个指针,见下文。

为什么代码使用NodePtr &headNodePtr 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;
4

2 回答 2

4

为什么代码只使用“NodePtr &head”而不是“NodePtr head”,因为 head 已经是一个指针?

原因是它需要函数所做的任何更改head才能对调用者可见。

如果head通过值 ( NodePtr head) 而不是引用 ( NodePtr& head) 传递,则情况并非如此:当函数分配temp_ptr给 时head,此更改不会传播回调用者。head通过引用传递解决了这个问题。

于 2013-02-18T07:52:49.550 回答
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,您需要有一个指向列表头的指针,该指针也是一个指针。否则,在函数中执行的更新将保持在本地。在您的代码中,您引用了一个指针,这与传递“双”指针的效果相同。

于 2013-02-18T07:54:12.940 回答