Функция рекурсивной печати для связанного списка - PullRequest
0 голосов
/ 14 октября 2018

Итак, мой профессор хотел бы, чтобы мы разработали рекурсивные функции для связанного списка из этого класса 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(node->next) в функции displayListRecursive, все печатается нормально.Но тогда это не совсем рекурсивная функция, верно?Либо это?У кого-нибудь есть ответы, которые могут это объяснить?(Я ДЕЙСТВИТЕЛЬНО новичок в рекурсии)

1 Ответ

0 голосов
/ 15 октября 2018

Я думаю, что рекурсивное определение в порядке.Он напечатает предоставленный вами узел, а затем вызывает сам себя до следующего 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);
    }

}
...