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:
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.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;
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.