|
@@ -78,6 +78,33 @@ PROCEDURE GetPosLastElement (l : List) : CARDINAL ;
|
|
|
RETURN l^.lastElement^.pos
|
|
RETURN l^.lastElement^.pos
|
|
|
END GetPosLastElement;
|
|
END GetPosLastElement;
|
|
|
|
|
|
|
|
|
|
+PROCEDURE AddElement (VAR l : List; pos : CARDINAL) : BOOLEAN ;
|
|
|
|
|
+
|
|
|
|
|
+VAR
|
|
|
|
|
+ localElementPtr : ElementPtr;
|
|
|
|
|
+ localElementPtr1 : ElementPtr;
|
|
|
|
|
+ localElementPtr2 : ElementPtr;
|
|
|
|
|
+
|
|
|
|
|
+BEGIN
|
|
|
|
|
+ IF l # NIL THEN
|
|
|
|
|
+ IF pos > l^.lastElement^.pos THEN
|
|
|
|
|
+ RETURN FALSE
|
|
|
|
|
+ END;
|
|
|
|
|
+ localElementPtr := l^.firstElement;
|
|
|
|
|
+ WHILE l^.localElementPtr^.pos # pos DO
|
|
|
|
|
+ localElementPtr := localElementPtr^.next;
|
|
|
|
|
+ END;
|
|
|
|
|
+ localElementPtr1 := localElementPtr^.next;
|
|
|
|
|
+ NEW(localElementPtr2);
|
|
|
|
|
+ localElementPtr2^.next := localElementPtr1;
|
|
|
|
|
+ localElementPtr^.next:= localElementPtr;
|
|
|
|
|
+ WHILE localElementPtr1 # NIL DO
|
|
|
|
|
+ localElementPtr1^.pos := localElementPtr1^.pos + 1
|
|
|
|
|
+ END;
|
|
|
|
|
+ ELSE
|
|
|
|
|
+ RETURN TRUE
|
|
|
|
|
+ END;
|
|
|
|
|
+END AddElement;
|
|
|
|
|
|
|
|
PROCEDURE AddElementLast (VAR l : List );
|
|
PROCEDURE AddElementLast (VAR l : List );
|
|
|
|
|
|
|
@@ -102,12 +129,65 @@ VAR
|
|
|
|
|
|
|
|
END AddElementLast ;
|
|
END AddElementLast ;
|
|
|
|
|
|
|
|
-PROCEDURE RemoveElement (VAR l : List);
|
|
|
|
|
|
|
+PROCEDURE FindElement (l : List ; pos : CARDINAL ; VAR p : ElementPtr) : BOOLEAN ;
|
|
|
|
|
|
|
|
|
|
+VAR
|
|
|
|
|
+ localElementPtr : ElementPtr;
|
|
|
|
|
+ localElementPtrNext : ElementPtr;
|
|
|
|
|
+ localPos : CARDINAL;
|
|
|
|
|
+
|
|
|
BEGIN
|
|
BEGIN
|
|
|
- ;
|
|
|
|
|
|
|
+ (* test if pos is not outside intervalle *)
|
|
|
|
|
+ IF pos > l^.lastElement^.pos THEN
|
|
|
|
|
+ RETURN FALSE
|
|
|
|
|
+ END;
|
|
|
|
|
+
|
|
|
|
|
+ localElementPtr := l^.firstElement;
|
|
|
|
|
+
|
|
|
|
|
+ (* test if pos is the first element *)
|
|
|
|
|
+ IF pos = 0 THEN
|
|
|
|
|
+ p := localElementPtr;
|
|
|
|
|
+ RETURN TRUE
|
|
|
|
|
+ END;
|
|
|
|
|
+
|
|
|
|
|
+ (* other cases : we go the list along*)
|
|
|
|
|
+ WHILE localElementPtr # NIL DO
|
|
|
|
|
+ localElementPtr := localElementPtr^.next;
|
|
|
|
|
+ IF localElementPtr^.pos = pos THEN
|
|
|
|
|
+ p := localElementPtr;
|
|
|
|
|
+ RETURN TRUE
|
|
|
|
|
+ END;
|
|
|
|
|
+ END;
|
|
|
|
|
+ RETURN FALSE
|
|
|
|
|
+ END FindElement;
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+PROCEDURE RemoveElement (VAR l : List; pos : CARDINAL ) : BOOLEAN ;
|
|
|
|
|
+
|
|
|
|
|
+VAR
|
|
|
|
|
+ localElementPtr1 : ElementPtr;
|
|
|
|
|
+ localElementPtr2 : ElementPtr;
|
|
|
|
|
+
|
|
|
|
|
+ BEGIN
|
|
|
|
|
+ IF l # NIL THEN
|
|
|
|
|
+ IF pos > l^.lastElement^.pos THEN
|
|
|
|
|
+ RETURN FALSE
|
|
|
|
|
+ ELSIF pos = l^.firstElement THEN
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ ELSIF pos = l^.lastElement THEN
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ ELSE
|
|
|
|
|
+ (* case where the element is in-betwwen *)
|
|
|
|
|
+
|
|
|
|
|
+ END;
|
|
|
|
|
+ ELSE
|
|
|
|
|
+ RETURN FALSE
|
|
|
|
|
+ END;
|
|
|
END RemoveElement;
|
|
END RemoveElement;
|
|
|
|
|
|
|
|
|
|
+
|
|
|
PROCEDURE DoEmptyList (VAR l : List);
|
|
PROCEDURE DoEmptyList (VAR l : List);
|
|
|
|
|
|
|
|
BEGIN
|
|
BEGIN
|