|
@@ -1,6 +1,6 @@
|
|
|
IMPLEMENTATION MODULE SingleLinkedList;
|
|
IMPLEMENTATION MODULE SingleLinkedList;
|
|
|
|
|
|
|
|
-FROM SYSTEM IMPORT ADDRESS;
|
|
|
|
|
|
|
+FROM SYSTEM IMPORT ADDRESS;
|
|
|
FROM Storage IMPORT ALLOCATE, DEALLOCATE;
|
|
FROM Storage IMPORT ALLOCATE, DEALLOCATE;
|
|
|
|
|
|
|
|
TYPE
|
|
TYPE
|
|
@@ -12,12 +12,12 @@ TYPE
|
|
|
END;
|
|
END;
|
|
|
List = POINTER TO ListRec;
|
|
List = POINTER TO ListRec;
|
|
|
ListRec = RECORD
|
|
ListRec = RECORD
|
|
|
- firstElement : ElementPtr;
|
|
|
|
|
- lastElement : ElementPtr;
|
|
|
|
|
- homogene : BOOLEAN; (* allows or not homogene items *)
|
|
|
|
|
- CheckType : PROC; (* procedure to check if the elements are of the same type *)
|
|
|
|
|
|
|
+ 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;
|
|
END;
|
|
|
-
|
|
|
|
|
|
|
|
|
|
(*
|
|
(*
|
|
|
PROCEDURE SearchItem ( item : ; compare : PROC ) : BOOLEAN;
|
|
PROCEDURE SearchItem ( item : ; compare : PROC ) : BOOLEAN;
|
|
@@ -32,7 +32,7 @@ PROCEDURE Traverse (l : List; toDo : PROC);
|
|
|
;
|
|
;
|
|
|
END Traverse;
|
|
END Traverse;
|
|
|
*)
|
|
*)
|
|
|
-PROCEDURE Empty (l : List): BOOLEAN ;
|
|
|
|
|
|
|
+PROCEDURE Empty (VAR l : List): BOOLEAN ;
|
|
|
|
|
|
|
|
BEGIN
|
|
BEGIN
|
|
|
IF l^.firstElement = NIL THEN
|
|
IF l^.firstElement = NIL THEN
|
|
@@ -55,8 +55,66 @@ PROCEDURE AddItem (): BOOLEAN;
|
|
|
END Add;
|
|
END Add;
|
|
|
|
|
|
|
|
*)
|
|
*)
|
|
|
|
|
+PROCEDURE SetPos(l : List; pos : CARDINAL ) : BOOLEAN ;
|
|
|
|
|
|
|
|
-PROCEDURE DeleteAllItems (l : List);
|
|
|
|
|
|
|
+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
|
|
BEGIN
|
|
|
|
|
|
|
@@ -66,17 +124,23 @@ PROCEDURE Free ( VAR l : List);
|
|
|
|
|
|
|
|
BEGIN
|
|
BEGIN
|
|
|
DeleteAllItems(l);
|
|
DeleteAllItems(l);
|
|
|
|
|
+ DoEmptyList(l);
|
|
|
l^.firstElement := NIL;
|
|
l^.firstElement := NIL;
|
|
|
|
|
+ l^.lastElement := NIL;
|
|
|
|
|
+ l^.currentElement := NIL;
|
|
|
l^.homogene := TRUE ;
|
|
l^.homogene := TRUE ;
|
|
|
l^.CheckType := NIL;
|
|
l^.CheckType := NIL;
|
|
|
- DISPOSE (l);
|
|
|
|
|
|
|
+ DISPOSE (l); (* destroying the List structure record *)
|
|
|
|
|
+ l := NIL;
|
|
|
END Free;
|
|
END Free;
|
|
|
|
|
|
|
|
PROCEDURE Init ( VAR l : List; mode : BOOLEAN ; p : PROC );
|
|
PROCEDURE Init ( VAR l : List; mode : BOOLEAN ; p : PROC );
|
|
|
|
|
|
|
|
BEGIN
|
|
BEGIN
|
|
|
- NEW (l);
|
|
|
|
|
|
|
+ NEW (l); (* creating the List structure record *)
|
|
|
l^.firstElement := NIL;
|
|
l^.firstElement := NIL;
|
|
|
|
|
+ l^.lastElement := l^.firstElement;
|
|
|
|
|
+ l^.currentElement := l^.firstElement;
|
|
|
l^.homogene := mode;
|
|
l^.homogene := mode;
|
|
|
l^.CheckType := p;
|
|
l^.CheckType := p;
|
|
|
END Init;
|
|
END Init;
|