所以我的教授希望我们为这个类'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)
时,一切都打印正常。但是它不是一个真正的递归函数,对吧?还是吗?有人有一些答案可以解释这一点吗?(我对递归真的很陌生(
我认为递归定义很好。它将打印您提供的节点,然后用下一个节点调用自身,直到其NULL
。
因此,您只需从第一个节点调用递归函数即可。
问题是您使用 while 循环中的所有节点多次调用它displayList
. 我认为,如果您只是删除 while 循环,它应该按预期工作。
像这样:
void addressBookType::displayList() const
{
displayListRecursive(head);
}
void addressBookType::displayListRecursive(ListNode *node) const
{
if(node != NULL)
{
(node->value).print();
displayListRecursive(node->next);
}
}