2013-08-23 78 views
1

現在我看到了兩種啓動節點的方法?我們是否需要爲鏈表節點分配內存?

  1. Node c={6, NULL}; 
    Node b={3, &c}; 
    Node a={1, &b}; 
    Node *root = &a; 
    
  2. Node * new_Node = (Node*)malloc(sizeof(Node)); 
    new_Node->data = 10; 
    new_Node->next = &m; 
    

哪個更好?哪個是對的?

另一個問題是我們如何釋放內存?

對於1,我們不需要釋放mem對嗎?

對於2,對於下一個指針,free(root->next)root->data=NULL,這是刪除節點的正確方法嗎?

+1

你應該選擇C或C++,而不是兩者。在C++中,通常不會像這樣使用'malloc'和'free'。 – juanchopanza

回答

2

兩者都是正確的。首先依靠實例化堆棧上的對象並將它們分配給Node *,稍後將在堆上實例化對象(使用malloc)。

free可用於釋放由malloc分配的內存。

你是對的第一種情況 - 你不需要釋放內存。

在第二種情況 - 鏈表 - 創建了免費的包裝中,你傳遞一個Node **,遍歷鏈表,直到你得到空節點,保存下一個節點,然後free當前之一。最後還可以選擇將參數設置爲NULL

+1

第一個幾乎肯定是*不正確*。什麼樣的鏈表實現可能只適用於堆棧變量? –

+0

@JonathonReinhart如果鏈表的作用域在這個堆棧的函數中,那麼這不正確嗎? –

+0

是的,但是什麼樣的鏈表只能使用堆棧上固定數量的節點?我的意思是,這當然是可能的,但我不能說我見過它,我也不能很好地利用它。 –

2

對於#1,您不需要釋放內存。局部變量在堆棧上。

free(root->next) 

這不會釋放一切。這隻會釋放一個節點。

兩者都不是好或正確。這取決於你想要做什麼。決定性的因素是在程序開始運行之前是否知道要創建多少個對象。如果你這樣做,那麼#1(在堆棧上創建局部變量)是可以的。例如,如果你確信你將永遠不會有超過100個節點,你可以創建一個大小爲100

Node NodeList[100]; 

的節點的數組如果你不事先知道尺寸你要必須使用malloc/free來管理堆上的節點;

+0

如果我使用NodeList [100],是否需要malloc空間?它是不是int a [100],不需要malloc/new? – hellocoding

相關問題