2013-02-18 79 views
2

我在head_insert的代码下面附加一个在链表顶部插入新节点。该功能用head_insert(head)调用。链接列表,指针操作

我不确定该函数的第一个参数的语法,因为它已经是一个指针了,所以我期待NodePtr,请看下面。

为什么代码只使用NodePtr &head而不是NodePtr 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

为什么代码只使用“NodePtr&head”而不是“NodePtr head”,因为head已经是指针了? – 2013-02-18 07:52:19

+1

不要用[c]和[C++]标记问题。虽然C++理解C代码,但在C语言中被认为是很好的风格在C++中是很少风格的。 – 2013-02-18 07:52:20

+0

@saraMcKnight:这应该是一个编辑,而不是评论。 – 2013-02-18 07:53:30

回答

4

为什么代码使用“NODEPTR &头”,而不是“NODEPTR头”只能作为头已经是一个指针?

原因是它需要任何变化,该函数使得head对调用者可见。

如果head由值(NodePtr head),而不是通过引用(NodePtr& head)通过这不会是这种情况:当该函数将分配给temp_ptrhead,这种变化不会传播回给调用者。通过引用地址head这个。

+0

但即使你通过每个值,头会改变,因为头持有头节点的地址 – 2013-02-18 07:56:10

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,你需要有一个指针列表头,这也是一个指针。否则,在该函数中执行的更新将保持在本地。在你的代码中,你引用了一个指针,它只是传递一个“double”指针的效果。

+0

,但如果我用head_insert(struct Node * head,...) – 2013-02-18 08:12:14

+0

如果你这样做,'head = new_head '不会影响函数外部的'head'。 – Rerito 2013-02-18 08:17:09

+0

但为什么因为它的值(地址)将被改变.. – 2013-02-18 08:24:24