Ich bin da nicht ganz zufrieden:
Delphi-Quellcode:
procedure ClearList;
var
TempNode: PNode;
begin
CurrentNode := FirstNode;
while (CurrentNode <> nil) do
begin
TempNode := CurrentNode.Next;
Dispose (CurrentNode);
CurrentNode := TempNode;
end;
FirstNode := nil;
LastNode := nil;
end;
Wenn es den FirstNode und den LastNode gibt sollte mann sie auch nutzen, wobei bei den einfach verketteten Listen der LastNode eigentlich überflüssig ist.
Delphi-Quellcode:
procedure ClearList;
// ---- TempNode ist überflüssig
//var
// TempNode: PNode;
begin
CurrentNode := FirstNode;
repeat
FirstNode:=FirstNode^.Next; // FirstNode zeigt immer auf den ersten gültigen...
dispose(CurrentNode); // Freigeben
CurrentNode:=FirstNode; // CurrentNode nachziehen
until CurrentNode=Nil;
//FirstNode := nil; ----das ist er schon!!
LastNode := FirstNode;
end;
Mir gefällt hier "Return until" besser, weil es mir logischer erscheint.
Edit:
einfügen von Daten an beliebiger Stelle in eine doppelt verkettete Liste:
Delphi-Quellcode:
{ FirstNode ist wirklich der erste! }
{ CurrentNode enthält Daten und .next und .last sind mit Nil vorbelegt! }
begin
LastNode:=FirstNode;
While (LastNode.next<>Nil) and (LastNode^.data<>MeineBedingung) do LastNode:=LastNode^.next;
{-- vor LastNode einfügen --}
CurrentNode^.last:=LastNode^.last;
CurrentNode^.last^.next:=CurrentNode;
CurrentNode^.next:=LastNode;
LastNode^.last:=CurrentNode;
{-- nach LastNode einfügen --}
CurrentNode^.last:=LastNode;
CurentNode^.next:=LastNode^.next;
LastNode^.next:=CurrentNode;
if CurrentNode^.next<>Nil then
currentNode^.next^.last:=CurrentNode;
end;
Gruß
K-H