使用C ++第2部分递归打印链接列表

时间:2013-11-26 20:52:14

标签: c++ recursion linked-list

我正在尝试递归打印我的列表,但我遇到了麻烦。输出是无限2 ....... 2 .....直到我的电脑崩溃。

我的递归函数如下:

//void List::PrintListRecursively()
void List::PrintListRecursively(){

    if (curr==NULL)
    {
        cout << "\n";
        return;
    }
    cout << curr->data <<endl;
    PrintListRecursively();
}

我的主要功能如下:

int  main()
{
    List myList;


    myList.insertAtTail(2);
    myList.insertAtTail(3);
    myList.insertAtHead(0);
    myList.insertAtHead(-1);
    myList.insertAtHead(-2);
    myList.PrintListRecursively();

}

我原来的递归函数是下面的代码,但我不知道如何将参数传递给原始函数,因为它是一个void函数。该函数不必是void,我只是不知道如何将指针传递给函数,尤其是递归。递归总是让我失望。

void List::PrintListRecursively(){

    if (curr==NULL)
    {
        cout << "\n";
        return;
    }
    cout << curr->data <<endl;
    PrintListRecursively(curr->next);
}

有人建议:

void List::PrintListRecursively(Node* curr)

因为我正在使用typedef:typedef struct node * nodePtr; 我试过这个:

void List::PrintListRecursively(nodePtr curr)

但我刚收到此错误:声明与void List :: PrintListRecursively

不兼容

请帮助

2 个答案:

答案 0 :(得分:2)

  

我刚收到此错误:Declaration is incompatible with void List::PrintListRecursively

您的声明和定义必须匹配。您可以保留不带参数的公共函数,然后提供第二个实现。所以你的声明看起来像这样:

class List {
   //...
   public:
      void PrintListRecursively();

   private:
      void PrintListRecursively(nodePtr curr);
};

定义:

void List::PrintListRecursively(){
    PrintListRecursively(head);
}

void List::PrintListRecursively(nodePtr curr) {
    if (curr==NULL)
    {
        cout << "\n";
        return;
    }
    cout << curr->data <<endl;
    PrintListRecursively(curr->next);
}

答案 1 :(得分:1)

您的第二个版本有正确的想法,在递归调用之前前进到下一个列表元素,但没有正确实现它。由于PrintListRecursively本身定义了List(与接收一个List实例相比),正确的推进方法是在下一个方法中调用方法元素,没有参数。

换句话说,您的第二个实现需要以cur->next->PrintListRecursively();

结束