链接列表,指针操作

时间:2013-02-18 07:47:06

标签: c++ pointers

我附加在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;

2 个答案:

答案 0 :(得分:4)

  

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

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

如果head按值(NodePtr head)而不是按引用(NodePtr& head)传递,则不会出现这种情况:当函数将temp_ptr分配给headhead,此更改不会传播回调用方。通过引用传递{{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,您需要有一个指向列表头的指针,它也是一个指针。否则,在函数中执行的更新将保持本地。在你的代码中,你引用了一个指针,它与传递“双”指针的效果相同。