2011-09-28 55 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;