| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192 |
- MODULE LISTS;
- IMPORT C := COLLECTIONS;
- TYPE
- ITEM* = POINTER TO RECORD (C.ITEM)
- prev*, next*: ITEM
- END;
- LIST* = POINTER TO RECORD
- first*, last*: ITEM
- END;
- PROCEDURE push* (list: LIST; item: ITEM);
- BEGIN
- ASSERT(list # NIL);
- ASSERT(item # NIL);
- IF list.first = NIL THEN
- list.first := item;
- item.prev := NIL
- ELSE
- ASSERT(list.last # NIL);
- item.prev := list.last;
- list.last.next := item
- END;
- list.last := item;
- item.next := NIL
- END push;
- PROCEDURE pop* (list: LIST): ITEM;
- VAR
- last: ITEM;
- BEGIN
- ASSERT(list # NIL);
- last := list.last;
- IF last # NIL THEN
- IF last = list.first THEN
- list.first := NIL;
- list.last := NIL
- ELSE
- list.last := last.prev;
- list.last.next := NIL
- END;
- last.next := NIL;
- last.prev := NIL
- END
- RETURN last
- END pop;
- PROCEDURE insert* (list: LIST; cur, nov: ITEM);
- VAR
- next: ITEM;
- BEGIN
- ASSERT(list # NIL);
- ASSERT(nov # NIL);
- ASSERT(cur # NIL);
- next := cur.next;
- IF next # NIL THEN
- next.prev := nov;
- nov.next := next;
- cur.next := nov;
- nov.prev := cur
- ELSE
- push(list, nov)
- END
- END insert;
- PROCEDURE insertL* (list: LIST; cur, nov: ITEM);
- VAR
- prev: ITEM;
- BEGIN
- ASSERT(list # NIL);
- ASSERT(nov # NIL);
- ASSERT(cur # NIL);
- prev := cur.prev;
- IF prev # NIL THEN
- prev.next := nov;
- nov.prev := prev
- ELSE
- nov.prev := NIL;
- list.first := nov
- END;
- cur.prev := nov;
- nov.next := cur
- END insertL;
- PROCEDURE delete* (list: LIST; item: ITEM);
- VAR
- prev, next: ITEM;
- BEGIN
- ASSERT(list # NIL);
- ASSERT(item # NIL);
- prev := item.prev;
- next := item.next;
- IF next # NIL THEN
- IF prev # NIL THEN
- prev.next := next;
- next.prev := prev
- ELSE
- next.prev := NIL;
- list.first := next
- END
- ELSE
- IF prev # NIL THEN
- prev.next := NIL;
- list.last := prev
- ELSE
- list.first := NIL;
- list.last := NIL
- END
- END
- END delete;
- PROCEDURE count* (list: LIST): INTEGER;
- VAR
- item: ITEM;
- res: INTEGER;
- BEGIN
- ASSERT(list # NIL);
- res := 0;
- item := list.first;
- WHILE item # NIL DO
- INC(res);
- item := item.next
- END
- RETURN res
- END count;
- PROCEDURE getidx* (list: LIST; idx: INTEGER): ITEM;
- VAR
- item: ITEM;
- BEGIN
- ASSERT(list # NIL);
- ASSERT(idx >= 0);
- item := list.first;
- WHILE (item # NIL) & (idx > 0) DO
- item := item.next;
- DEC(idx)
- END
- RETURN item
- END getidx;
- PROCEDURE create* (list: LIST): LIST;
- BEGIN
- IF list = NIL THEN
- NEW(list)
- END;
- list.first := NIL;
- list.last := NIL
- RETURN list
- END create;
- END LISTS.
|