链表的递归打印功能

时间:2018-10-14 20:55:55

标签: c++11 recursion printing linked-list derived-class

因此,我的教授希望我们为此类“ addressBookType”类的链表设计递归函数,该类源自其他4个类。该程序基本上会创建一个包含该人的姓名,地址,日期和关系的地址簿,每个地址簿都有自己的类。

她要执行的递归功能是打印,追加,删除和顺序搜索。

但这是问题所在。递归函数的主要前提是它应该在函数定义中调用自身,对吗?我成功制作了递归追加函数,但是递归打印函数遇到了麻烦。

原始打印功能和递归打印功能如下:

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)时,一切都可以正常打印。但这不是真正的递归函数吗?还是?任何人都有可以解释这一点的答案? (我真的是递归的新手)

1 个答案:

答案 0 :(得分:1)

我认为递归定义很好。它将打印您提供的节点,然后调用下一个直到其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);
    }

}