2014-04-08 79 views
2

我有一個作業問題說:如何編寫遞歸函數的方法定義?

Destructor_Helper是一個遞歸函數,釋放單個鏈表的每個節點。爲destructor_helper編寫一個方法定義。

struct Node 
{ 
     string data; 
     Node *next; 
} 

void List::~List() { 
    destructor_helper(head); 
} 

我的回答是:

 void Destructor_Helper(Node *n) { 
    cout<< n->data << endl; 
    if (n->next != NULL) 
      Destructor_Helper(n->next); 
} 

我的回答是算錯了,會有人幫我找出這個問題。

+3

提示:你在哪裏取消分配? – juanchopanza

+0

它實際上並沒有刪除任何內容。 –

+0

所以加入「delete n;」該功能會改變嗎? – user3467152

回答

5

你的答案被錯誤計數,因爲你沒有做任何釋放。

要取消分配鏈接列表,可以存儲下一個節點,取消分配當前值,然後遞歸執行下一個節點。我想是這樣的:

void destructor_helper(Node *n) { 
    if (n == NULL) return; 
    Node* next = n->next; 
    delete n; 
    destructor_helper(next); 
} 

你可以很容易地發現遞歸,這是在當前節點是NULL基本情況。那時我們只需要返回。然後,我們將下一個節點存儲在名爲next的局部變量中,然後刪除當前。局部變量next可以是NULL,這沒關係。然後遞歸地傳遞next以刪除列表的其餘部分。

+0

將它更改爲void List :: destructor_helper(Node * n)是否重要? – user3467152

+0

@ user3467152,根本沒有。 – Shoe

1

** **擾流

void Destructor_Helper(Node *n) { 
    cout<< n->data << endl; 
    if (n->next != NULL) 
    { 
     Destructor_Helper(n->next); 
    } 
    delete n; 
} 

應該做的伎倆。

+0

void列表:: Destructor_Helper(Node * n) – user3467152

+0

重要嗎? – user3467152

+1

它無關緊要。我剛剛複製了你的方法並添加了'delete n;'。實際上,Destructor_Helper()*應該是List的一個方法來封裝它的功能。所以這對設計很重要。 – TobiMcNamobi