showcase23lib.mod 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. GENERIC IMPLEMENTATION MODULE DList;
  2. PROCEDURE Init(VAR l : List);
  3. BEGIN l.head := NIL; l.tail := NIL; l.count := 0 END Init;
  4. PROCEDURE Append(VAR l : List; v : T);
  5. VAR n : Node;
  6. BEGIN
  7. NEW(n); n^.val := v; n^.next := NIL; n^.prev := l.tail;
  8. IF l.tail # NIL THEN l.tail^.next := n ELSE l.head := n END;
  9. l.tail := n; l.count := l.count + 1
  10. END Append;
  11. PROCEDURE Prepend(VAR l : List; v : T);
  12. VAR n : Node;
  13. BEGIN
  14. NEW(n); n^.val := v; n^.prev := NIL; n^.next := l.head;
  15. IF l.head # NIL THEN l.head^.prev := n ELSE l.tail := n END;
  16. l.head := n; l.count := l.count + 1
  17. END Prepend;
  18. PROCEDURE Count(VAR l : List) : INTEGER;
  19. BEGIN RETURN l.count END Count;
  20. PROCEDURE Get(VAR l : List; i : INTEGER) : T;
  21. VAR n : Node; k : INTEGER;
  22. BEGIN
  23. n := l.head; k := 0;
  24. WHILE k < i DO n := n^.next; k := k + 1 END;
  25. RETURN n^.val
  26. END Get;
  27. PROCEDURE Sum(VAR l : List) : T;
  28. VAR n : Node; s : T;
  29. BEGIN
  30. s := 0; n := l.head;
  31. WHILE n # NIL DO s := s + n^.val; n := n^.next END;
  32. RETURN s
  33. END Sum;
  34. PROCEDURE Reverse(VAR l : List);
  35. VAR n, nx : Node;
  36. BEGIN
  37. n := l.head;
  38. WHILE n # NIL DO
  39. nx := n^.next; n^.next := n^.prev; n^.prev := nx; n := nx
  40. END;
  41. n := l.head; l.head := l.tail; l.tail := n
  42. END Reverse;
  43. PROCEDURE ForEach(VAR l : List;
  44. visit : PROCEDURE(VAR acc : INTEGER; v : T);
  45. VAR acc : INTEGER);
  46. VAR n : Node;
  47. BEGIN
  48. n := l.head;
  49. WHILE n # NIL DO visit(acc, n^.val); n := n^.next END
  50. END ForEach;
  51. END DList.