Referenz auf den Listenkopf

Beim Entfernen eines Elementes könnten wir zuerst die Liste durchsuchen, ob das Element überhaupt mit dieser Liste verwaltet wird. Das ist allerdings aufwendig. Zum Einfügen müsste weiterhin jede Liste durchsucht werden, bei dem das Element Mitglied sein könnte. Das kostet massivst Rechenzeit. Eine Mehrleistung kostet immer Rechenzeit oder Arbeitsspeicher. Im schlimmsten Fall beides.

Alternativ können wir jedem Node die Information mitgeben, in welcher Liste er verwaltet wird:

struct AddressNode
{
  struct AddressNode * Next;
  struct AddressNode * Prev;
 
  struct AddressList * List;
 
  struct Address     * Data;
};

Nun kann InsertNode zunächst abfragen, ob die das Element überhaupt einer Liste hinzugefügt werden kann und dies gegebenenfalls verweigern. RemoveNode() und DeleteNode() benötigen nun nicht mehr das Argument, aus welcher Liste eine Node entfernt werden muss, denn die Node liefert diese Information sofort mit. Hier ist ein Fehler also gar nicht mehr möglich.

RemoveNode() setzt nun den Zeiger zur Liste List wieder auf NULL, InsertNode() prüft erst, ob das Element Mitglied in einer Liste ist, in dem Fall zeigt List irgendwohin, aber eben nicht auf NULL.