链表的递归打印函数

Recursive Print Function for Linked List

所以我的教授希望我们从这个 class 'addressBookType' 派生自其他 4 个 classes 的链表设计递归函数。该程序基本上创建了一个地址簿,其中包含人员的姓名、地址、日期和关系,每个都有自己的 classes。

她想做的递归函数是打印、追加、删除和顺序搜索。

但是问题来了。函数递归的主要前提是它应该在函数定义中调用自身,对吧?我成功地创建了递归附加函数,但我在使用递归打印函数时遇到了问题。

原始打印函数和递归打印函数如下:

void addressBookType::displayList() const
{
    ListNode *nodePtr; // To move through list

    nodePtr = head; // start at the head of list

    while(nodePtr != NULL) // while nodePtr points to a node, move through list
    {
        displayListRecursive(nodePtr);
        nodePtr = nodePtr->next;
    }
}

void addressBookType::displayListRecursive(ListNode *node) const
{
    if(node != NULL)
    {
        (node->value).print();

        displayListRecursive(node->next);
    }

}

我遇到的问题是,当我 运行 程序时,所有内容都打印出来,然后它开始打印第二个对象,直到只剩下一个对象。这是我打印时的意思:

1
2
3
4

2
3
4

3
4

4

我会粘贴实际输出的内容,但它非常冗长,因为每个对象都会显示此人的名字、姓氏、地址、街道、邮政编码、城市、州、日期和关系类型。

每当我在 displayListRecursive 函数中取出 displayListRecursive(node->next) 时,一切都会正常打印。但它并不是真正的递归函数,对吧?或者是吗?任何人都有一些答案可以解释这一点? (我真的是递归新手)

我认为递归定义很好。它将打印您提供的节点,然后用下一个节点调用自己,直到它 NULL.

所以你只需要从第一个节点调用递归函数。

问题是您在 displayList 的 while 循环中使用所有节点多次调用它。 我认为,如果您只是删除 while 循环,它应该会按预期工作。

像这样:

void addressBookType::displayList() const
{
    displayListRecursive(head);
}

void addressBookType::displayListRecursive(ListNode *node) const
{
    if(node != NULL)
    {
        (node->value).print();

        displayListRecursive(node->next);
    }

}