Lazarus/Delphie doppelt verkettete Listen - wer kann mir das erklären?

...komplette Frage anzeigen

2 Antworten

Puh...ich hoffe mal, ich bekomme die Syntax noch korrekt zusammen, wenn nicht, bitte ich um Verzeihung ;-)

Erstmal das Grundkonzept: Jedes Objekt ist in einem Knoten hinterlegt. Dazu liegt auch je ein Pointer für den Vorgänger- und Nachfolgerknoten.

Das sieht dann ungefähr so aus:

Type
  TNodePtr = ^TNode;
  TNode = Record
    Data : int
    Prev : TNodePtr
    Next : TNodePtr
  End;

Wenn deine Liste nur aus einem Knoten besteht, ist Prev und Next jeweils nil.

Willst du den ersten Knoten der Liste finden, gehst du von einem beliebigen Knoten immer zu Prev, solange bis Prev nil ist, das ist dann das erste Element. Den letzten Knoten findest du auf die gleiche Art und Weise (nur eben mit Next).

Um einen neuen Knoten in eine Liste einzufügen hast du 2 Optionen: Vor dem aktuellen Knoten oder danach.
Sei der aktuelle Knoten 'CurrentNode' und der neue Knoten 'NewNode' und du willst davor einfügen. Dann musst du nur folgendes tun:

NewNode.Prev := CurrentNode.Prev;
NewNode.Next := @CurrentNode;
CurrentNode.Prev := @NewNode;

Ich bin ziemlich sicher, das die Syntax, insbesondere der Pointerarithmetik falsch ist (habe 15 Jahre nix mehr mit Delphi gemacht). Das sollte die Grundidee allerdings trotzdem ausreichend darstellen

Dahinter einfügen ist dann genau das gleiche (mit Next und Prev vertauscht).

Was möchtest Du wissen?