IMPLEMENTATION MODULE SingleLinkedList; FROM SYSTEM IMPORT ADDRESS; FROM Storage IMPORT ALLOCATE, DEALLOCATE; TYPE ElementPtr = POINTER TO Element; Element = RECORD pos : CARDINAL; next : ElementPtr; item : ADDRESS; END; List = POINTER TO ListRec; ListRec = RECORD firstElement : ElementPtr; lastElement : ElementPtr; currentElement : ElementPtr; homogene : BOOLEAN; (* allows or not homogene items *) CheckType : PROC; (* procedure to check if the elements are of the same type *) END; (* PROCEDURE SearchItem ( item : ; compare : PROC ) : BOOLEAN; BEGIN ; END Seach; PROCEDURE Traverse (l : List; toDo : PROC); BEGIN ; END Traverse; *) PROCEDURE Empty (VAR l : List): BOOLEAN ; BEGIN IF l^.firstElement = NIL THEN RETURN TRUE ELSE RETURN FALSE END END Empty; (* PROCEDURE RemoveItem (): BOOLEAN; BEGIN ; END Remove; PROCEDURE AddItem (): BOOLEAN; BEGIN ; END Add; *) PROCEDURE SetPos(l : List; pos : CARDINAL ) : BOOLEAN ; BEGIN IF pos <= l^.lastElement^.pos THEN l^.currentElement^.pos := pos; RETURN TRUE ELSE RETURN FALSE END; END SetPos; PROCEDURE GetPosCurrentElement (l : List) : CARDINAL ; BEGIN RETURN l^.currentElement^.pos END GetPosCurrentElement; PROCEDURE GetPosLastElement (l : List) : CARDINAL ; BEGIN RETURN l^.lastElement^.pos END GetPosLastElement; PROCEDURE AddElementLast (VAR l : List ); VAR localElementPtr : ElementPtr; BEGIN IF l # NIL THEN (*creating NEW element first, THEN add it TO the list *) NEW(localElementPtr); localElementPtr^.next := NIL; localElementPtr^.item := NIL; IF l^.firstElement = NIL THEN l^.firstElement := localElementPtr; localElementPtr^.pos := 0; ELSE localElementPtr^.pos := l^.lastElement^.pos + 1; END; l^.currentElement := localElementPtr; l^.lastElement := localElementPtr; END END AddElementLast ; PROCEDURE RemoveElement (VAR l : List); BEGIN ; END RemoveElement; PROCEDURE DoEmptyList (VAR l : List); BEGIN END DoEmptyList; PROCEDURE DeleteAllItems (VAR l : List); BEGIN END DeleteAllItems; PROCEDURE Free ( VAR l : List); BEGIN DeleteAllItems(l); DoEmptyList(l); l^.firstElement := NIL; l^.lastElement := NIL; l^.currentElement := NIL; l^.homogene := TRUE ; l^.CheckType := NIL; DISPOSE (l); (* destroying the List structure record *) l := NIL; END Free; PROCEDURE Init ( VAR l : List; mode : BOOLEAN ; p : PROC ); BEGIN NEW (l); (* creating the List structure record *) l^.firstElement := NIL; l^.lastElement := l^.firstElement; l^.currentElement := l^.firstElement; l^.homogene := mode; l^.CheckType := p; END Init; BEGIN (* Initialization of the SingleLinkedList structure *) END SingleLinkedList.