IMPLEMENTATION MODULE lists2; FROM Storage IMPORT ALLOCATE,DEALLOCATE; (* Länkade lagringsstrukturer: listor, med pekare & dynamisk minnesallokering. *) TYPE NodIndex = POINTER TO ListNod; List = NodIndex; ListNod = RECORD head:Info; tail:List END; PROCEDURE null(l:List):BOOLEAN; (* null testar om en lista är tom *) BEGIN RETURN l=NIL END null; PROCEDURE nil():List; BEGIN RETURN NIL END nil; PROCEDURE cons(x:Info; xs:List):List; (* cons lägger till x först i listan xs *) VAR i:NodIndex; BEGIN (* tag en ny nod *) NEW(i); (* fyll i den *) i^.head:=x; i^.tail:=xs; RETURN i END cons; PROCEDURE hd(l:List):Info; (* hd ger första elementet i listan l *) BEGIN RETURN l^.head END hd; PROCEDURE tl(l:List):List; (* tl ger resten av listan l utan första elementet *) BEGIN RETURN l^.tail END tl; PROCEDURE changeHd(l:List; x:Info); (* byter ut första elementet i listan l mot x *) BEGIN l^.head:=x END changeHd; PROCEDURE changeTl(l:List; l2:List); (* byter ut resten av listan efter första elementet mot l2 *) BEGIN l^.tail:=l2 END changeTl; PROCEDURE disposeList(l:List); VAR i:List; BEGIN WHILE NOT null(l) DO i:=l; l:=tl(l); DISPOSE(i) END END disposeList; PROCEDURE insert(x:Info; VAR xs:List); BEGIN IF null(xs) OR (x