2016-05-29 4 views
-2
void ReversePrint(Node *head) 
{ 
    Node *sec=(Node *)malloc(sizeof(Node)); 
    sec->next=NULL; 
    sec->data=0; 
    if(head!=NULL) 
    { 
     ReversePrint(head->next); 
     Node *tmp=sec; 
     tmp->data=head->data; 
     cout<<tmp->data<<endl; 
     tmp=tmp->next; 
    } 
cout<<"hello"<<endl; 
} 

вход: 2 1 4 5Может ли кто-нибудь объяснить, как выполняются инструкции после завершения рекурсии?

выход: - привет привет привет привет привет

Я не понимаю, как привет печатается перед последний элемент (первый элемент в этом случае, т.е. обратный порядок) связанного списка.

+0

Упоминание языка программирования поможет. – JJJ

+1

@Juhana Я уже говорил о языке программирования, спасибо за предложение –

+2

Я предлагаю вам следовать этому коду с помощью отладчика, чтобы понять поток выполнения. Также обратите внимание, что этот код является утечкой памяти. –

ответ

2

tmp и sec являются ненужными и просто вызывают утечку памяти каждый раз. Удалите их и использовать вместо:

cout << head->data << endl; 

Итак:

void ReversePrint(Node *node) 
{ 
    //cout << "("; 
    if (node != NULL) 
    { 
     ReversePrint(head->next); 
     cout << node->data << endl; 
    } 
    cout << "hello" << endl; 
    //cout << "hello" << ")" << endl; 
} 

Что было сделано не служит никакой цели, это выглядит как попытка повернуть вспять сам список, но это должно быть сделано по-другому, без распределение.

+0

вывод для этой функции такой же, как и заданный в вопросе –

+0

'(((((((hello) 5) привет) 4) привет) 1) привет) 2) hello' - Это первый привет, node имеет значение null (и оператор if пропускается). –

2

В принципе, вы вызываете ReversePrint() с "head = 2" -> "next = 1" -> "next = 4" -> "next = 5" -> "next = NULL". Только тогда наступает первый cout, печать привет. Затем программа восстанавливает стек вызовов (возвращается к узлу «5»), печатает , а затем привет. Затем снова повторяя (возвращаясь к узлу «4») ... и т.д.

Если вы хотите, чтобы избежать этого первого «привет» (а также принимая во внимание другие ответы), попробуйте следующее:

void ReversePrint(Node * node) 
{ 
    if(node == NULL) // to make sure the very first element of the list is not NULL 
     return; 

    if(node->next != NULL) 
     ReversePrint(node->next); 

    cout << node->data << endl; 
    cout << "hello" << endl; 
} 

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

  • Нет связанных вопросов^_^