SingleLinkedList.mod 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231
  1. IMPLEMENTATION MODULE SingleLinkedList;
  2. FROM SYSTEM IMPORT ADDRESS;
  3. FROM Storage IMPORT ALLOCATE, DEALLOCATE;
  4. TYPE
  5. ElementPtr = POINTER TO Element;
  6. Element = RECORD
  7. pos : CARDINAL;
  8. next : ElementPtr;
  9. item : ADDRESS;
  10. END;
  11. List = POINTER TO ListRec;
  12. ListRec = RECORD
  13. firstElement : ElementPtr;
  14. lastElement : ElementPtr;
  15. currentElement : ElementPtr;
  16. homogene : BOOLEAN; (* allows or not homogene items *)
  17. CheckType : PROC; (* procedure to check if the elements are of the same type *)
  18. END;
  19. (*
  20. PROCEDURE SearchItem ( item : ; compare : PROC ) : BOOLEAN;
  21. BEGIN
  22. ;
  23. END Seach;
  24. PROCEDURE Traverse (l : List; toDo : PROC);
  25. BEGIN
  26. ;
  27. END Traverse;
  28. *)
  29. PROCEDURE Empty (VAR l : List): BOOLEAN ;
  30. BEGIN
  31. IF l^.firstElement = NIL THEN
  32. RETURN TRUE
  33. ELSE
  34. RETURN FALSE
  35. END
  36. END Empty;
  37. (*
  38. PROCEDURE RemoveItem (): BOOLEAN;
  39. BEGIN
  40. ;
  41. END Remove;
  42. PROCEDURE AddItem (): BOOLEAN;
  43. BEGIN
  44. ;
  45. END Add;
  46. *)
  47. PROCEDURE SetPos(l : List; pos : CARDINAL ) : BOOLEAN ;
  48. BEGIN
  49. IF pos <= l^.lastElement^.pos THEN
  50. l^.currentElement^.pos := pos;
  51. RETURN TRUE
  52. ELSE
  53. RETURN FALSE
  54. END;
  55. END SetPos;
  56. PROCEDURE GetPosCurrentElement (l : List) : CARDINAL ;
  57. BEGIN
  58. RETURN l^.currentElement^.pos
  59. END GetPosCurrentElement;
  60. PROCEDURE GetPosLastElement (l : List) : CARDINAL ;
  61. BEGIN
  62. RETURN l^.lastElement^.pos
  63. END GetPosLastElement;
  64. PROCEDURE AddElement (VAR l : List; pos : CARDINAL) : BOOLEAN ;
  65. VAR
  66. localElementPtr : ElementPtr;
  67. localElementPtr1 : ElementPtr;
  68. localElementPtr2 : ElementPtr;
  69. BEGIN
  70. IF l # NIL THEN
  71. IF pos > l^.lastElement^.pos THEN
  72. RETURN FALSE
  73. END;
  74. localElementPtr := l^.firstElement;
  75. WHILE l^.localElementPtr^.pos # pos DO
  76. localElementPtr := localElementPtr^.next;
  77. END;
  78. localElementPtr1 := localElementPtr^.next;
  79. NEW(localElementPtr2);
  80. localElementPtr2^.next := localElementPtr1;
  81. localElementPtr^.next:= localElementPtr;
  82. WHILE localElementPtr1 # NIL DO
  83. localElementPtr1^.pos := localElementPtr1^.pos + 1
  84. END;
  85. ELSE
  86. RETURN TRUE
  87. END;
  88. END AddElement;
  89. PROCEDURE AddElementLast (VAR l : List );
  90. VAR
  91. localElementPtr : ElementPtr;
  92. BEGIN
  93. IF l # NIL THEN
  94. (*creating NEW element first, THEN add it TO the list *)
  95. NEW(localElementPtr);
  96. localElementPtr^.next := NIL;
  97. localElementPtr^.item := NIL;
  98. IF l^.firstElement = NIL THEN
  99. l^.firstElement := localElementPtr;
  100. localElementPtr^.pos := 0;
  101. ELSE
  102. localElementPtr^.pos := l^.lastElement^.pos + 1;
  103. END;
  104. l^.currentElement := localElementPtr;
  105. l^.lastElement := localElementPtr;
  106. END
  107. END AddElementLast ;
  108. PROCEDURE FindElement (l : List ; pos : CARDINAL ; VAR p : ElementPtr) : BOOLEAN ;
  109. VAR
  110. localElementPtr : ElementPtr;
  111. localElementPtrNext : ElementPtr;
  112. localPos : CARDINAL;
  113. BEGIN
  114. (* test if pos is not outside intervalle *)
  115. IF pos > l^.lastElement^.pos THEN
  116. RETURN FALSE
  117. END;
  118. localElementPtr := l^.firstElement;
  119. (* test if pos is the first element *)
  120. IF pos = 0 THEN
  121. p := localElementPtr;
  122. RETURN TRUE
  123. END;
  124. (* other cases : we go the list along*)
  125. WHILE localElementPtr # NIL DO
  126. localElementPtr := localElementPtr^.next;
  127. IF localElementPtr^.pos = pos THEN
  128. p := localElementPtr;
  129. RETURN TRUE
  130. END;
  131. END;
  132. RETURN FALSE
  133. END FindElement;
  134. PROCEDURE RemoveElement (VAR l : List; pos : CARDINAL ) : BOOLEAN ;
  135. VAR
  136. localElementPtr1 : ElementPtr;
  137. localElementPtr2 : ElementPtr;
  138. BEGIN
  139. IF l # NIL THEN
  140. IF pos > l^.lastElement^.pos THEN
  141. RETURN FALSE
  142. ELSIF pos = l^.firstElement THEN
  143. ELSIF pos = l^.lastElement THEN
  144. ELSE
  145. (* case where the element is in-betwwen *)
  146. END;
  147. ELSE
  148. RETURN FALSE
  149. END;
  150. END RemoveElement;
  151. PROCEDURE DoEmptyList (VAR l : List);
  152. BEGIN
  153. END DoEmptyList;
  154. PROCEDURE DeleteAllItems (VAR l : List);
  155. BEGIN
  156. END DeleteAllItems;
  157. PROCEDURE Free ( VAR l : List);
  158. BEGIN
  159. DeleteAllItems(l);
  160. DoEmptyList(l);
  161. l^.firstElement := NIL;
  162. l^.lastElement := NIL;
  163. l^.currentElement := NIL;
  164. l^.homogene := TRUE ;
  165. l^.CheckType := NIL;
  166. DISPOSE (l); (* destroying the List structure record *)
  167. l := NIL;
  168. END Free;
  169. PROCEDURE Init ( VAR l : List; mode : BOOLEAN ; p : PROC );
  170. BEGIN
  171. NEW (l); (* creating the List structure record *)
  172. l^.firstElement := NIL;
  173. l^.lastElement := l^.firstElement;
  174. l^.currentElement := l^.firstElement;
  175. l^.homogene := mode;
  176. l^.CheckType := p;
  177. END Init;
  178. BEGIN
  179. (* Initialization of the SingleLinkedList structure *)
  180. END SingleLinkedList.