2016-02-03 53 views
3

我正在瀏覽鏈接列表,我有困惑。也許我在混合這個概念或其他東西。這是創建頭節點的代碼。鏈接列表的基礎知識混亂

struct node 
{ 
    int data; 
    struct node *link; 
}; 
node *head; 
void main() 
{ 
    head = new node; 
} 

1)我想知道的第一件事是我們如何在相同的節點結構中編寫struct node *link;?因爲首先使用節點結構創建,那麼我們可以聲明它的指針。
2)node *head;將已經聲明一個size節點的內存,那麼我們需要再次做head = new node;

+3

'struct node * link'只是一個_pointer_到節點;直到使用'new'或可能'malloc()'創建一個正式節點纔會存在。作爲一名大學生,我也爲這個概念而努力。所以要清楚,沒有無限的節點鏈。 –

+0

@TimBiegeleisen:我所理解的是'int'類型指針可以容納'int'類型變量的地址。類似地,節點類型指針將保存下一個節點的地址。如果我們聲明'int'類型的指針,並要求他保存節點的地址,那是不可能的。它是正確的嗎?我不確定 –

+0

你目前有什麼是編譯器錯誤。 'void main()'是無效的C++。不要讓任何破碎的編譯器告訴你不同的東西。用'int main()'代替,你得到'head'指向'node'。直到'head-> link =&someNode;'或'head-> link = new node();'之後,該節點纔會指向任何東西。現在'link'處於危險狀態。在使用它之前,你沒有好的方法來測試'link'是否指向一個有效的節點,並且冒着未定義行爲的風險。建議向'node'添加一個構造函數,將'link'設置爲'nullptr'。 – user4581301

回答

1

自引用結構體可以包含一個指向自身的指針。請不要將指針的大小與結構的大小混淆。不管數據類型如何,指針的大小都是恆定的。

struct node 
{ 
    int data; 
    struct node *link; 
}; 

有了它的struct node *link是別的東西像struct node link,它不會編譯,就像你的想法。

關於爲什麼需要使用new分配,當我們這樣做node *head,它說,head點與區域實際節點的內存位置datalink

這可能是閱讀pointer概念有用再次

+0

簡單來說..我所理解的是'int'類型指針可以容納'int'類型變量的地址。類似地,節點類型指針將保存下一個節點的地址。如果我們聲明'int'類型的指針,並要求他保存節點的地址,那是不可能的。它是正確的嗎? –

+0

是的,C編譯它,但這是一個邏輯錯誤,因爲你正確指出 – dlmeetei

+0

'head'應指向'memory',它是使用'new'分配的。刷你的指針概念 – dlmeetei

0

鏈接列表是對象鏈。你在這裏做的是用兩個變量創建一個結構體。一個是存儲在這個節點中的日期。另一個是遞歸結構。這在鏈接列表獲取他們的名字。一個結構鏈接到下一個。創建此節點時,鏈接沒有值,但可以通過創建新節點並將其存儲在鏈接中來添加節點。

至於你的其他代碼,我認爲你沒有做對。通常節點被包裝在鏈接列表類中,以便您可以通過添加,刪除和搜索節點來控制鏈接列表。當你控制鏈接列表時,你至少需要兩個指針。一個指向列表中的第一個節點(也稱爲「頭」)。第二個指針是搜索指針,它將從頭部開始逐個節點直到找到所需的內容。

現在要回答你的第二個問題,當你寫node* head你只是聲明指針。您沒有聲明「大小節點的內存」,所以在鏈接列表的初始化函數中,您需要創建第一個節點並指向它的節點head = new node;