2011-09-28 53 views
1

我需要使用遞歸來計算鏈表中的節點。關於函數參數和遞歸的類和默認值的C++問題

unsigned CLL::CountNodes(CNode* val) 
{ 
    if(!val) 
     return 0; 
    else 
     return 1 + CountNodes(val->next); 
} 

所以,當我要算節點的鏈表,從說,另一個函數,我去:

int main() 
{ 
    CLL list(); 
    cout << list.CountNodes(list.head); 
} 

這似乎有些冒險,但因爲該類應該能夠在沒有我傳遞給列表頭的頭的點的情況下算清單。這似乎是一個for循環直截了當;然而,與遞歸,我試過:

unsigned CLL::CountNodes(CNode* val = head) 
{ 
    if(!val) 
     return 0; 
    else 
     return 1 + CountNodes(val->next); 
} 

但這不起作用,因爲頭不是靜態的。然後讓頭腦靜止是一個問題,因爲我必須在課堂外宣佈它。

反正有解決問題嗎? 例如cout < < list.CountNodes(); 或者當使用遞歸時,是否必須始終傳遞列表的頭部?

+0

謝謝你的提問,歡迎堆棧溢出! – 2011-09-28 03:18:39

回答

0

你可以有一個公共職能int CountNodes()調用this->head私人int CountNodes(CNode*)方法。

// in class CLL 
public: 
    unsigned int CountNodes() 
    { 
     return CountNodes(head); 
    } 

private: 
    CNode* head; 
    unsigned int CountNodes(CNode* val) 
    { 
     if(!val) 
      return 0; 
     else 
      return 1 + CountNodes(val->next); 
    } 

現在你已經有了更好的封裝,你的頭數據成員是私人的,你的客戶端代碼可以變得更簡單。

int main() 
{ 
    CLL list(); 
    cout << list.CountNodes(); 
} 
0

使用2個功能。第一個是書面的,另外一個沒有以'head'作爲參數的第一個參數。

1

在C++中總是有一種方法。您可能有兩個overloaded functions,例如:

unsigned CountNodes (CNode* val) 
{ 
    return val ? CountNodes(val->next) + 1 : 0; 
} 

unsigned CountNodes() 
{ 
    return CountNodes (head); 
} 

我也建議讓unsigned CountNodes (CNode* val)功能static因爲它沒有從CLL類需要什麼,並unsigned CountNodes()method constant,因爲它不會改變對象的狀態。

順便說一句,在C++中有一個ternary operator,使生活更輕鬆,代碼更具可讀性,甚至可以使其更快。因此,而不是:

if(!val) 
     return 0; 
    else 
     return 1 + CountNodes(val->next); 

...你可以寫這樣的:

return val ? 1 + CountNodes(val->next) : 0;