2013-02-18 78 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