Man kann einen Listenanfang und ein Listenende definieren. Das sind zwei Knoten der Liste, die keine Daten enthalten aber eben garantiert immer am Anfang bzw. am Ende der Liste sind. Dann muss man nicht auf NIL prüfen.
Eine andere Möglichkeit besteht darin, das das letzte Element nicht auf NIL zeigt (als Nachfolger), sondern wieder auf die Listen-Wurzel (auch so ein Dummy-Element)
Also:
Delphi-Quellcode:
Procedure InitDList (aRoot : TNode);
Begin
aRoot.lNext := aRoot;
aRoot.lPrev := aRoot;
End;
Function FirstElement (aRoot : TNode) : TNode;
Begin
If aRoot.Lnext = aRoot Then
Result :=Nil
Else
Result := aRoot.lNext;
End;
Function LastElement (aRoot : TNode) : TNode;
Begin
If aRoot.lPrev = aRoot Then
Result := Nil
Else
Result := aRoot.lPrev;
End;
Procedure DeleteNode (aRoot : TNode; aKey : TKey);
Var
p : TNode;
Begin
p := FirstElement (aRoot);
While (p<>nil) And (p.Key <> aKey) Do p := p.lNext; // Complete
p.lPrev.lNext := p.lNext;
p.lNext.lPrev := p.lPrev;
Dispose (p);
End;
...
Ein Element nach seinem Index zu suchen ist eigentlich Schwachsinn, weil man dafür lieber ein Array nimmt.