2014-01-27 48 views
1

在研究c中的鏈表時,我遇到了2個不同的頭節點實現。 說,如果下面是所用的結構:在c中的鏈表中的頭節點c

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

那麼第一個實現是在頭節點只是在它沒有實際數據的虛擬節點,而只是一個到另一個節點(第一個實際節點鏈接用數據)這樣的:

struct node *head; 
head->next = NULL; //head->next would then be linked to the first node. 

第二implementaton是一個其中的頭節點是與它的數據被使用malloc命令存儲到分配空間給它的第一實際節點。

我的問題是,我們怎麼能在第一個實現中使用「head-> next」,我們還沒有使用malloc分配頭部空間呢?因爲據我所知(如果我錯了,糾正我),節點的兩個字段只能在空間分配給該節點後才能使用。

+0

顯示更多源代碼。你的問題很混亂。和'node.js'有什麼關係? –

回答

1

你缺少一個C dynamic memory allocation

struct node *head = malloc(sizeof (struct node)); 
if (!head) { perror("malloc node"); exit(EXIT_FAILURE); }; 
head->next = NULL; 
// initialize other fields of head 

不要忘了初始化的head所有的領域!閱讀malloc(3)

您可以擁有包含第一個指針的全局變量full_list,例如,

if (!full_list) 
    full_list = head; 

this見...閱讀linked list Wiki頁面。

3

只有在動態分配內存時才需要malloc。如果在方法內部寫入類似struct node head的東西,頭節點將被分配到堆棧中,並且將存活(並死亡)在那裏。因此,您可以將數據寫入此節點,但一旦該方法結束,它就會死亡。

或者,您可以在全球範圍內定義頭部,在這種情況下,它將被靜態分配,並且將永遠活着直到程序退出。只有當你想創建一段內存後,malloc纔會被需要。這個內存將在函數退出後繼續運行。只有在指針上撥打free時才能清除。

+0

這是不正確的。你可以在你喜歡的任何地方寫'struct node * head',它仍然不會分配頭節點,它會分配一個指針,而不是一個節點。另一方面,如果你寫'struct node head',那麼它會使用自動存儲來分配一個節點。 (「在堆棧上」) –

+0

你說得對,那就是我的意思,但我想我有一個大腦放屁,並把它作爲一個指針。固定。 – George

1

你說得對,如果你還沒有初始化頭部,那麼頭部不會指向下一個節點,所以你必須初始化它,這就是爲什麼第二個實現被一致使用的原因。如果你正在使用第一種方法,你仍然需要初始化它,如果你正在初始化它,爲什麼現在要使用它的數據變量。