showcase23lib.mod 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  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 First(VAR l : List) : T;
  28. BEGIN RETURN l.head^.val END First;
  29. PROCEDURE Last(VAR l : List) : T;
  30. BEGIN RETURN l.tail^.val END Last;
  31. PROCEDURE Reverse(VAR l : List);
  32. VAR n, nx : Node;
  33. BEGIN
  34. n := l.head;
  35. WHILE n # NIL DO
  36. nx := n^.next; n^.next := n^.prev; n^.prev := nx; n := nx
  37. END;
  38. n := l.head; l.head := l.tail; l.tail := n
  39. END Reverse;
  40. END DList.