SingleLinkedList.mod 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  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 AddElementLast (VAR l : List );
  65. VAR
  66. localElementPtr : ElementPtr;
  67. BEGIN
  68. IF l # NIL THEN
  69. (*creating NEW element first, THEN add it TO the list *)
  70. NEW(localElementPtr);
  71. localElementPtr^.next := NIL;
  72. localElementPtr^.item := NIL;
  73. IF l^.firstElement = NIL THEN
  74. l^.firstElement := localElementPtr;
  75. localElementPtr^.pos := 0;
  76. ELSE
  77. localElementPtr^.pos := l^.lastElement^.pos + 1;
  78. END;
  79. l^.currentElement := localElementPtr;
  80. l^.lastElement := localElementPtr;
  81. END
  82. END AddElementLast ;
  83. PROCEDURE RemoveElement (VAR l : List);
  84. BEGIN
  85. ;
  86. END RemoveElement;
  87. PROCEDURE DoEmptyList (VAR l : List);
  88. BEGIN
  89. END DoEmptyList;
  90. PROCEDURE DeleteAllItems (VAR l : List);
  91. BEGIN
  92. END DeleteAllItems;
  93. PROCEDURE Free ( VAR l : List);
  94. BEGIN
  95. DeleteAllItems(l);
  96. DoEmptyList(l);
  97. l^.firstElement := NIL;
  98. l^.lastElement := NIL;
  99. l^.currentElement := NIL;
  100. l^.homogene := TRUE ;
  101. l^.CheckType := NIL;
  102. DISPOSE (l); (* destroying the List structure record *)
  103. l := NIL;
  104. END Free;
  105. PROCEDURE Init ( VAR l : List; mode : BOOLEAN ; p : PROC );
  106. BEGIN
  107. NEW (l); (* creating the List structure record *)
  108. l^.firstElement := NIL;
  109. l^.lastElement := l^.firstElement;
  110. l^.currentElement := l^.firstElement;
  111. l^.homogene := mode;
  112. l^.CheckType := p;
  113. END Init;
  114. BEGIN
  115. (* Initialization of the SingleLinkedList structure *)
  116. END SingleLinkedList.