2016-09-09 61 views
3

我试图用递归方式在链表中的每个节点上打印数据,但是我越界了,所以我认为我的递归函数有问题。递归地打印一个列表

这里的头文件:

class List 
{ 
public: 
    void print(std::ostream &out) const {} 
private: 
    Node *head; 
    void printList(std::ostream&, const Node*) const; 
} 

基本上,我是从公共print函数调用的私人助手功能。下面是两个函数的代码:

void List::print(std::ostream& out) const 
{ 
    printList(out, head); 
} 

void List::printList(std::ostream& out, const Node* n) const 
{ 
    if(n->next == NULL) { 
     out << n->data << std::endl; 
     return; 
    } 

    out << n->data << std::endl; 

    printList(out, n->next); 
} 

我认为问题出在我的if块,因为我需要停下来,如果没有下一个节点,也是返回前打印在当前节点的数据,但由于我已在printList(out, n->next)末尾拨打n->next,我是否需要在我的if区块中执行此操作?

有递归执行此操作的更好方法吗?代码是否适用于其他人?我似乎无法得到它的工作。

+0

我宁愿写'无效列表::的printList(STD :: ostream的进出,常量节点* N)const的 { 如果(N == NULL){ 回报; } out << n-> data << std :: endl; printList(out,n-> next);为简单起见, –

+0

您确定在创建节点时将节点的'next'指针初始化为空指针吗?或者至少确保列表中最后一个节点的'next'指针是空指针? –

+0

在基本情况下是否正确将'n-> next'设置为'nullptr'?或者它是一个随机的,未初始化的地址? – RyanP

回答

5

您需要更改if()中的条件。您应该检查当前节点是否为NULL而不是下一个节点。

void List::printList(std::ostream& out, const Node* n) const { 
    if(n == NULL) { 
     return; 
    } 
    out << n->data << std::endl; 
    printList(out, n->next); 
} 
+0

这有帮助。这实际上更有意义,哈!谢谢! – WitchKing17