2016-05-29 3 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; 
} 

input: 2 1 4 5Kann jemand erklären, wie die Anweisungen ausgeführt werden, sobald die Rekursion beendet ist?

Ausgabe ist: - Hallo Hallo Hallo Hallo Hallo

verstehe ich nicht, wie Hallo, bevor das gedruckt wird, letztes Element (in diesem Fall erstes Element, dh umgekehrte Reihenfolge) der verketteten Liste.

+0

Das Erwähnen der Programmiersprache würde helfen. – JJJ

+1

@Juhana Ich habe jetzt die Programmiersprache erwähnt, danke für den Vorschlag –

+2

Ich schlage vor, diesem Code mit einem Debugger zu folgen, um den Ausführungsablauf zu verstehen. Beachten Sie außerdem, dass dieser Code Speicher verliert. –

Antwort

2

tmp und sec sind nicht erforderlich und verursachen jedes Mal ein Speicherleck. sie entfernen und stattdessen verwenden: So

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; 
} 

Was wurde dient keine Zwecken, es wie ein Versuch, sieht die Liste selbst, zu umkehren, aber das anders gemacht werden sollte, ohne Zuweisung.

+0

Ausgabe für diese Funktion ist die gleiche wie die in Frage gegeben –

+0

'((((Hallo) 5) Hallo) 4) Hallo) 1) Hallo) 2) Hallo' - Das ist das erste Hallo wird gedruckt, wenn Der Knoten ist null (und die if-Anweisung wird übersprungen). –

2

Grundsätzlich rufen Sie ReversePrint() mit "head = 2" -> "next = 1" -> "next = 4" -> "next = 5" -> "next = NULL". Nur dann kommt die erste cout, Drucken Hallo. Dann rückt das Programm den Aufrufstapel zurück (geht zurück zum Knoten "5") und druckt gefolgt von hallo. Dann wieder zurückzuverfolgen (going back „4“ zum Knoten) ... usw.

Wenn Sie das erste „Hallo“ vermeiden wollen (und unter Berücksichtigung der anderen Antworten), versuchen Sie dies:

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; 
} 
Verwandte Themen