2013-11-26 3 views
-1

Я пытаюсь распечатать свой список рекурсивно, но у меня проблемы с ним. Выход - бесконечность 2 ....... 2 ..... до моего компьютера.Печать LinkedList Рекурсивно с использованием C++ Часть 2

Моя рекурсивная функция выглядит следующим образом:

//void List::PrintListRecursively() 
void List::PrintListRecursively(){ 

    if (curr==NULL) 
    { 
     cout << "\n"; 
     return; 
    } 
    cout << curr->data <<endl; 
    PrintListRecursively(); 
} 

Моя основная функция заключается в следующем:

int main() 
{ 
    List myList; 


    myList.insertAtTail(2); 
    myList.insertAtTail(3); 
    myList.insertAtHead(0); 
    myList.insertAtHead(-1); 
    myList.insertAtHead(-2); 
    myList.PrintListRecursively(); 

} 

Моя оригинальная рекурсивная функция была ниже код, но я не знаю, как передать параметр исходной функции, так как он является функцией void. Функция не должна быть недействительной, я просто не знаю, как передать указатель на функцию, особенно рекурсивно. Рекурсия всегда меня отбрасывает.

void List::PrintListRecursively(){ 

    if (curr==NULL) 
    { 
     cout << "\n"; 
     return; 
    } 
    cout << curr->data <<endl; 
    PrintListRecursively(curr->next); 
} 

кто-то предложил:

void List::PrintListRecursively(Node* curr) 

, поскольку я использую ЬурейиЙ: ЬурейаЯ структуру узел * nodePtr; Я попытался это:

void List::PrintListRecursively(nodePtr curr) 

но я получаю эту ошибку: Декларация несовместима с ничтожным Списком :: PrintListRecursively

Помогите пожалуйста

+0

ли ваше объявление и соответствует определению для 'PrintListRecursively'? –

+0

Этот вопрос почти идентичен вашему [другому вопросу] (http://stackoverflow.com/questions/20226797/print-linkedlist-recursively-using-c) - пожалуйста, придерживайтесь существующего вопроса. – user4815162342

ответ

2

I just get this error: Declaration is incompatible with void List::PrintListRecursively

Ваше объявления и определения должны совпадать. Вы можете сохранить свою публичную функцию, которая не принимает никаких параметров, а затем обеспечит вторую реализацию. Так что ваши заявления выглядеть следующим образом:

class List { 
    //... 
    public: 
     void PrintListRecursively(); 

    private: 
     void PrintListRecursively(nodePtr curr); 
}; 

И определение:

void List::PrintListRecursively(){ 
    PrintListRecursively(head); 
} 

void List::PrintListRecursively(nodePtr curr) { 
    if (curr==NULL) 
    { 
     cout << "\n"; 
     return; 
    } 
    cout << curr->data <<endl; 
    PrintListRecursively(curr->next); 
} 
+0

Большое спасибо – Will

1

Вашей вторая версия имеет правильное представление, чтобы перейти к следующий элемент списка перед рекурсивным вызовом, но не реализует его правильно. Так как PrintListRecursively определяется на самом List (в отличие от , принимающего a List экземпляр), правильный способ продвижения - путем вызова метода на следующем элементе без аргументов.

Другими словами, ваша вторая реализация должна заканчиваться cur->next->PrintListRecursively();

+0

Я уверен, что в этой реализации узлы списка не содержат функции списка. Сам список, похоже, выполняет всю работу. – paddy

+0

@paddy Хорошая точка. Учитывая вызов 'PrintListRecursively', я принял список C-стиля, в котором список * является * головным узлом. Но это, по-видимому, противоречит существованию методов «insertAtHead» и «insertAtTail», которые указывают на наличие «хвоста» и «головы», доступных в «List». Если это действительно так, рекурсивная реализация потребует вспомогательной функции, как описано в вашем ответе. – user4815162342

Смежные вопросы