MODULE list;

FROM InOut   IMPORT Write, WriteLn, WriteString, ReadCard, WriteCard;
FROM Storage IMPORT ALLOCATE;

TYPE ref = POINTER TO word;
    word = RECORD
             key: CARDINAL;
             count:CARDINAL;
             next: ref
           END;

VAR k: CARDINAL;
   root,sentinel: ref;

PROCEDURE search(x: CARDINAL; VAR root: ref);
VAR w1,w2,w3: ref;

BEGIN
 w1 := root;
 sentinel^.key := x;
 IF w1 = sentinel THEN
   NEW(root);
   WITH root^ DO
     key := x;
     count := 1;
     next := sentinel
   END
 ELSIF w1^.key = x THEN
   INC(w1^.count);
 ELSE
   REPEAT w2 := w1; w1 := w2^.next UNTIL w1^.key =x;
   IF w1 = sentinel THEN
     w2 := root;
     NEW(root);
     WITH root^ DO
       key := x;
       count := 1;
       next := w2
     END
   ELSE
     INC(w1^.count);
     w2^.next := w1^.next;
     w1^.next := root;
     root := w1
   END
 END
END search;

PROCEDURE printlist(w,z: ref);
BEGIN
 WriteString('    Key  Count');
 WriteLn;
 WHILE w # z DO
   WriteCard(w^.key,6);
   WriteCard(w^.count,6);
   w := w^.next; WriteLn
 END
END printlist;

BEGIN
 NEW(sentinel);
 root := sentinel;
 LOOP
   WriteString(' Enter k> ');
   ReadCard(k); WriteLn;
   IF k = 0 THEN EXIT END;
   search(k,root);
 END;
 printlist(root,sentinel)
END list.