Entwickler-Ecke
Algorithmen, Optimierung und Assembler - Verkettete Listen
Marco D. - Do 25.05.06 15:34
Titel: Verkettete Listen
Hallo,
kann mir mal jemand an einem anschaulichen Beispiel den Einsatz
verketteter Listen erklären? Die Suche liefert drei Ergebnisse. Wikipedia sagt es so unverständlich.
Dankeschön
Moderiert von
Christian S.: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Do 25.05.2006 um 15:51
Marc. - Do 25.05.06 15:55
sers
Du meinst Verkette mit Listen mit Zeigern?
Ein Beispiel dafür, wo man diese einsetzt, wär mein kleiner Rechner, unten im Anhang. Die verketteten Listen gebrauche ich, um Rechenoperationen rückgängig zu machen oder um einfach einige Schritte zurückzugehen. (Auch Undo/Redo genannt) ;)
Mfg
Marco D. - Do 25.05.06 16:22
Würdest du den Quellcode auch hochladen? Oder ansonsten kurz das Prinzip mit Quelltextbeispiel(en) erklären?
Marc. - Do 25.05.06 16:51
Also, das ganze läuft mit einer sogenannten
Vorwärtsdeklaration
Das die Definition von TEelement erst nach der Zuweißung erfolgt, ist absicht!
Ich bin nun so vorgegangen, dass ich einen Record erstellt habe, in dem sich ein Zeiger auf den nächsten Record befindet.
Also erstes habe ich einen Zeiger auf den Typ TElement deklariert.
Dann erst wird TElement definiert: Dieser enthält, neben einigen anderen Variablen, einen Zeiger. Dieser Zeiger ist wiederum vom zuerst definierten Typ PElement, er erlaubt es also, auf einen solchen Record zu zeigen, wie der, in dem er sich selbst befindet!
Sowas nennt man eine Vorwärtsdeklaration.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154:
| type PElement = ^TElement; TElement = Record Text: String; Next: PElement; end;
...
var Rechner: TRechner; value1,value2: real; rewrite:boolean; operator: char; vorzeichen: char; Anker: PElement; Aktuell: PElement; implementation uses About; {$R *.dfm}
...
procedure TRechner.FormActivate(Sender: TObject); begin anker := NIL; aktuell := NIL; end;
procedure TRechner.FormDeactivate(Sender: TObject); var p, p_n: PElement; begin p := anker; while p <> NIL do begin p_n := p^.next; Dispose(p); p := p_n; end; end;
procedure new_value; var p1,p2: PElement; begin New(p1); p1^.text := unit_rechner.Rechner.Edit.text; p1^.next := NIL; if Anker = NIL then anker := p1 else begin p2 := anker; while(p2^.next <> NIL) do p2 := p2^.next; p2^.next := p1; end; aktuell := p1; end;
procedure TRechner.Button_forwardClick(Sender: TObject); begin try if aktuell^.next <> NIL then aktuell := aktuell^.next; Edit.Text := aktuell^.text except on EAccessViolation do begin statusbar.Panels.Items[0].Text := 'Es sind noch keine Elemente definiert!'; exit; end; end; end;
procedure TRechner.Button_backwardClick(Sender: TObject); var p: PElement; begin try p := anker; while (p <> NIL) and (p^.next <> aktuell) do p := p^.next;
if p <> NIL then aktuell := p; Edit.Text := aktuell^.text; except on EAccessViolation do begin statusbar.Panels.Items[0].Text := 'Es sind noch keine Elemente definiert!'; exit; end; end; end;
procedure TRechner.Button_deleteClick(Sender: TObject); var p: PElement; begin edit.Clear; value1 := 0; value2 := 0; rewrite := false; statusbar.Panels.Items[0].Text := 'Wert gelöscht.';
try if aktuell = anker then begin anker := aktuell^.next; Dispose(aktuell); aktuell := anker; end else begin p := anker; while (p <> NIL) and (p^.next <> aktuell) do p := p^.next; p^.next := aktuell^.next; Dispose(aktuell); aktuell := p; end except on EAccessViolation do begin statusbar.Panels.Items[0].Text := 'Es sind noch keine Elemente definiert!'; exit;
end; end; end;
procedure TRechner.Button_resetClick(Sender: TObject); var p, p_n: PElement; begin p := anker; while p <> NIL do begin p_n := p^.next; Dispose(p); p := p_n; end; anker := NIL; aktuell := NIL;
statusbar.Panels.Items[0].Text := 'Alle Werte gelöscht.'; edit.Text := ''; end; |
Mfg
Marco D. - Fr 26.05.06 13:53
Das erschlägt mich jetzt irgendwie.
Gibt es ein Tutorial zu verketteten Listen?
Marc. - Fr 26.05.06 14:01
Mit Sicherheit, aber ich könnte auch versuchen eins zu schreiben, solltest du keins finden ;)
Marco D. - Fr 26.05.06 14:12
Wo gibt es denn eins? Im DF hab ich schon gesucht.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!