Рекурсивный последовательный поиск ошибки вывода связанного списка - PullRequest
0 голосов
/ 15 октября 2018

Итак, мой профессор хотел бы, чтобы мы разработали рекурсивные функции для связанного списка из этого класса addressBookType, который унаследован от 4 других классов.Программа в основном создает адресную книгу с именем, адресом, датой и отношением человека, каждый из которых имеет свои собственные классы.

Рекурсивные функции, которые она хочет выполнить, - это печать, добавление, удаление и последовательное выполнение.search.

Я сделал их все рекурсивными, за исключением функции последовательного поиска.

Вот оригинальная и рекурсивная версия:

bool addressBookType::seqSearch(extPersonType item) const
{
    bool found = false;
    ListNode *nodePtr; // pointer to traverse the list

    nodePtr = head; // start the search at the first node

    found = seqSearchRecursive(nodePtr, item); // call recursive function

    if(found)
        found = (nodePtr->value == item); // test for equality

    return found;
}

bool addressBookType::seqSearchRecursive(ListNode *nPtr, extPersonType obj) const
{
    if(nPtr == NULL) // return false if value not found
    {
        return false;
    }
    else if(nPtr->value == obj) // return true if object found
    {
        return true;
    }
    else
        seqSearchRecursive(nPtr->next, obj); // call recursive funct with next value
}

Моя проблема в том, что я получаю ошибку вывода.Когда я удалил объект из списка и искал его, он вернул false.Затем я искал объект в списке, и он вернул false.Значит, что-то заставляет функцию всегда возвращаться в ложное состояние. У кого-нибудь есть предложения?

1 Ответ

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

Кажется, вы забыли ключевое слово return в блоке else.Таким образом, вызывается seqSearchRecursive, но его результат не используется, и функция достигает конца, ничего не возвращая, что считается неопределенным поведением для не пустых функций.Вы можете использовать флаги компилятора -Wall и -Wextra, чтобы получать уведомления о таких проблемах.

Я также могу посоветовать передать obj как const extPersonType& obj, если extPersonType не является псевдонимом базового типа.А поскольку c ++ 11, то nullptr предпочтительнее, чем NULL.

...