Verkettete Listen: Modifikation (1)


Wenn wir lineare Listen zur Ablage einer variablen Anzahl von Nutzdaten verwenden wollen, besteht oft der Wunsch, die Liste selbst zu modifizieren, statt eine geänderte Kopie abzulegen. Wir wollen uns über die dazu vorhandenen Möglichkeiten und ihren Aufwand einen Überblick verschaffen.

Die einfachsten Operationen sind das Einfügen und das Entfernen von Datenelementen am Listenanfang.  Sie haben offensichtlich konstanten Aufwand und lassen sich von den schon bekannten Operationen cons und tail leicht ableiten, wobei wir jetzt auf dem Original der Liste arbeiten; daher ist der Parameter l hier ein Durchgangsparameter:

PROCEDURE einfuege(a: atom; VAR l: liste);
VAR p: liste;
BEGIN NEW(p);
      p^.wert := a; p^.nach := l; l := p;
END einfuege;

PROCEDURE entferne(VAR a: atom; VAR l: liste);
VAR p: liste;
BEGIN p := l; a := p^.wert; l := p^.nach;
      DISPOSE(p);
END entferne;
Wie immer bei Pointer-Manipulationen veranschaulichen wir uns die Verhältnisse durch eine Skizze, auch für den Fall einer leeren Liste. Daß entferne nicht auf eine leere Liste angewendet werden darf, muß der Aufrufer sicherstellen; andernfalls enthält sein Programm einen logischen  Fehler. Wir prüfen darauf deshalb hier nicht zur Laufzeit.

Listen

Bemerkenswert ist bei Verwendung dieser Routinen, daß Datenwerte, die nacheinander eingetragen werden, beim Abholen in umgekehrter  Reihenfolge wieder erscheinen (LIFO-Prinzip, "Last-In-First-Out"). Ebenso verhält sich ein Stapel  von losen Seiten, und dieses Verhalten kommt so häufig in Anwendungen vor, daß es sich lohnt, es (später) durch einen eigenen abstrakten Datentyp stack zu modellieren.


zurück | Inhalt | Index | vor | Vorlesung

Klaus Lagally, 22. Februar 2000, 19:36