Advertisement
apfel2kuchen

Untitled

Nov 21st, 2014
178
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.80 KB | None | 0 0
  1. Beispiel 6.2.6
  2. Wir geben eine rekursive Prozedur für das Entfernen eines Elementes aus einer Liste
  3. an. Die entsprechende iterative Prozedur finden Sie als Beispiel 5.4.2.5 . Die folgende
  4. Prozedur zeigt eindrucksvoll, wie eine rekursive Lösung die
  5. Programmkomplexität drastisch reduzieren kann.
  6. procedure ListenElemEntfernen (inZahl : integer;
  7. var ioRefAnfang : tRefListe;
  8. var outGefunden : boolean);
  9. { entfernt aus einer Liste mit Anfangszeiger ioRefAnfang das Element mit dem Wert inZahl, bei erfolgreicher Entfernung wird outGefunden
  10. auf truegesetzt, sonst auf false }
  11.  
  12. var
  13. Zeiger : tRefListe;
  14. gefunden : boolean;
  15. begin
  16. if ioRefAnfang = nil then
  17. gefunden := false
  18. else
  19. if ioRefAnfang^.info = inZahl then
  20. { Element gefunden, also entfernen }
  21. begin
  22. Zeiger := ioRefAnfang;
  23. ioRefAnfang := ioRefAnfang^.next;
  24. dispose (Zeiger);
  25. gefunden := true
  26. end
  27. else
  28. { Element noch nicht gefunden, es folgt dasrekursive Durchsuchen des Listenrestes }
  29. ListenElemEntfernen (inZahl, ioRefAnfang^.next, gefunden);
  30. outGefunden := gefunden
  31. end; { ListenElemEntfernen }
  32.  
  33. Nehmen wir an wir haben eine Lineare Liste mit den Werten Adresse1 (10), Adresse2 (12), Adresse3 (20)!
  34. Wobei 10 die Wurzel ist und 12 der gesuchte wert ist.
  35. Also laufen wir das Programm das erste mal durch!
  36. ioRefAnfang zeigt beim ersten Aufruf auf die Wurzel der Liste!
  37. 1. if ioRefAnfang = nil... Trifft nicht zu
  38. 2. Er springt zum else Teil
  39. 3. if ioRefAnfang^.info = inZahl then .. Trifft nicht zu, da die gesuchte Zahl nicht in der Wurzel ist und der Aktuell wert ja 10 ist..
  40. 4. Er springt also in die Else Anweisung und die Funktion ruft sich nochmal selbst auf! Siehe nächste Zeile
  41. ListenElemEntfernen (inZahl, ioRefAnfang^.next, gefunden); ioRefAnfang^.Next zeigt hier ja Quasi noch auf Wurzel.Next, da es ein VAR-Parameter ist!
  42.  
  43. Wir kommen in die Rekursionsebene Nr.2
  44.  
  45. HIER BIN ICH MIR NICHT SICHER WAS PASSIERT.... (AB 2.1) Ist das Richtig???
  46. Erneute Ausführung der Funktion (Steht auf der 2 Zahl also in diesem Beispiel auf 12, der gesuchten Zahl)..
  47.  
  48. 1. if ioRefAnfang = nil... Trifft nicht zu
  49. 2. er springt zum Else Teil und prüft ob die gesuchte Zahl in ioRefAnfang^.Info steht, was auch stimmt somit werden die Anweisungen der else Anweisung ausgeführt
  50. 2.1 Zeiger := ioRefAnfang; {Hier wird Zeiger auf Adresse2 (l2) gesetzt, der VAR-Variable (ioRefAnfang) wird ja nichts zugewiesen}
  51. 2.2 ioRefAnfang := ioRefAnfang^.next; (Adresse2 soll auf Adresse3 zeigen, allerdings wird somit auch ioRefAnfang^.Next(Wurzel) auf Adresse 3 gesetzt, wegen dem Var-Parameter)
  52. 3.3 dispose (Zeiger); (Speicher von Zeiger wird freigegeben)
  53. 3.4 gefuden := True;
  54. 4. outGefunden := gefunden;
  55.  
  56. Schliesen der Rekursionsebene 2
  57. Nun wird in der ersten Ebene noch outGefunden auf gefunden gesetzt..
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement