Um solche Überraschungen zu vermeiden, ist es dringend zu empfehlen, sich den Effekt jeder Pointer-Manipulation durch eine Handskizze zu veranschaulichen!
Will man statt eines Alias wirklich ein neues Listenobjekt mit gleichem Inhalt wie ein gegebenes Objekt haben, das man dann unabhängig vom anderen verändern kann, so kann das nur über eine explizite tiefe Kopie geschehen, die einen neuen Zugriffspfad liefert:
Auch hier gibt es eine nicht ganz leicht zu verstehende iterative Version:PROCEDURE copy(l: liste; VAR p: liste); BEGIN IF l = NIL THEN p := NIL ELSE NEW(p); p^.wert := l^.wert; copy(l^.nach, p^.nach); END END copy;
PROCEDURE copy(l: liste; VAR p: liste); VAR q: liste; BEGIN IF l = NIL THEN p := NIL; ELSE NEW(p); q := p; WHILE l <> NIL DO q^.wert := l^.wert; l := l^.nach; IF l = NIL THEN q^.nach := NIL ELSE NEW(q^.nach); q := q^.nach; END; END; END; END copy;