Woher weiß eigentlich das Programm, dass es dann am Ende der Liste anfangen soll?
Und, dass es rückwärts und nicht vorwärts ausgeben soll?
Ich kanns immernoch nicht ganz nachvollziehen, deswegen versuchte ich es mit den Schleifen.
Das finde ich super, eine konkrete Frage
, ich hoffe nach diesem Beitrag wirst du das verstehen.
Benutze aber wenn du Code postest die Tasks dafür, da es sonst nicht ganz leicht den Wirrwar zu lesen (auch wenn es in diesem Fall, bei so wenig Code, noch ganz gut geht
)
Ich werde versuchen dir das zu erklären.
Hier nochmals der Quelltext:
C++:
void listenelement::ausgaberueckwaerts()
{
if(next != NULL) {
next->ausgaberueckwaerts();
}
cout << next->daten << 'n';
}
Die if-Abfrage prüft ob next ungleich NULL ist, solange ein nachfolgendes Objekt vorhanden ist, ist next ungleich NULL. Wenn next also nicht NULL ist dann wird die Funktion ausgaberueckwaets() nochmals aufgerufen, diesmal aber von dem jetzigen next und damit bist du in der nächsten Ebene in der genau das gleiche überprüft wird.
Da bis jetzt aber die Funktion immer wieder neu aufgerufen wurde, ist die Anweisung "cout" noch nicht aufgeführt worden sondern befindet sich in einer "Pause" und wartet bis die vorherigen Anweisung abgearbeitet werden. (die sich aber im Moment in einer anderen Ebene sind)
Wenn next gleich NULL ist heißt es das es keine Nachfolgende Ebene gibt. Dann wird die if-Abfrage übersprungen und es wir durch cout der Inhalt der Variable daten ausgegeben, aber da wir uns nun in der letzten Ebene befinden werden die Daten auch vom letzten Element ausgegeben.
Die Funktion des letzten Elements wird beendet und damit geht es im vorherigen Element mit der Anweisung nach dem if weiter.
So bekommst du den effekt, das die liste rückwärts ausgegeben wird.
________________________________________
Ich habe hier noch ein kleines Beispiel als Grafik:
http://img108.imageshack.us/img108/8359/rekursivmu9.png
(Die Fett-markierte Buchstaben sind die "Anweisungen" die noch nicht ausgeführt wurden, sondern warten bis das übergeordnete Element ihre Arbeit erfühlt hat)
jedes Mal wird durch die if-Abfrage geprüft ob next != NULL ist, solange das zutrifft wird die Methode/Funktion des nächsten Elements aufgerufen und da wir wieder getestet etc., und das solange bist next == NULL ist und das ist es erst wenn es kein nachfolgendes Element gibt.
Dann wird die Cout-Anweisung ausgeführt da die Bedingung in der Abfrage nicht mehr zutrifft.
Jetzt wird der Inhalt des letzten Elements ausgegeben:
Nach der Ausgabeanweisung ist die Funktion zu ende, das kann man ja auch an den Quelltext oben sehen. Mit dem Ende der Funktion, kehren wir wieder an die Position des vorherigen Elements und da geht es dann weiter. (wir haben die Funktion rekursiv aufgerufen) Danach steht die Anweisung die Daten des Elements auszugeben. In diesem Element wird
ausgegeben.
Da auch diese Funktion zu ende ist, kehren wir zu dem letzten Element (der letzten Ebene) zurück und setzten auch dort fort. Die Ausgabe-Anweisung wird auch hier ausgeführt.
Jetzt steht auf dem Monitor
Damit funktioniert der rekursiver Aufruf in diesem Fall so, zuerst geht man an das ende der Liste, dann fängt man von da aus an die daten auszugeben, dabei geht man immer eine Position in der liste zurück.
Es tut mir Leid wenn ich viel um den heißen Brei herum geredet habe, aber mir fällt das erklären nicht leicht. (das verstehen schon).
Ich hoffe das du das hier wenigstens etwas nach vollziehen kannst.
Gruß
Rudolf Grauberger