我需要使用递归来计算链表中的节点。
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&lt;&lt; list.CountNodes(); 或者在使用递归时是否必须传入列表的头部?
答案 0 :(得分: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;
答案 1 :(得分:0)
您可以使用int CountNodes()
调用私有int CountNodes(CNode*)
方法的公共函数this->head
。
// 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();
}
答案 2 :(得分:0)
使用2个功能。第一个是写的,另外一个没有参数,第一个以'head'作为参数调用。