1+ MODULE List ;
2+ IMPORT Out;
3+
4+ TYPE
5+ Object* = POINTER TO ObjectDesc;
6+ ObjectDesc* = RECORD
7+ compare*: PROCEDURE( this, other: Object): INTEGER ;
8+ print*: PROCEDURE( this: Object)
9+ END ;
10+ Element = POINTER TO ElementDesc;
11+ ElementDesc = RECORD
12+ value: Object;
13+ next: Element
14+ END ;
15+ List* = POINTER TO ListDesc;
16+ ListDesc* = RECORD
17+ first, last: Element;
18+ insert*: PROCEDURE( this: List; o: Object);
19+ delete*: PROCEDURE( this: List; o: Object);
20+ print*: PROCEDURE( this: List)
21+ END ;
22+
23+ (* Developer-defined types. *)
24+ Integer* = POINTER TO IntegerDesc;
25+ IntegerDesc* = RECORD ( ObjectDesc)
26+ value*: INTEGER
27+ END ;
28+
29+ VAR
30+ i: INTEGER ;
31+ value: Integer;
32+ l: List;
33+
34+ PROCEDURE compareInt ( this, other: Object): INTEGER ;
35+ BEGIN
36+ RETURN this( Integer). value - other( Integer). value
37+ END compareInt ;
38+
39+ PROCEDURE printInt ( this: Object);
40+ BEGIN
41+ Out. Int( this( Integer). value, 0 )
42+ END printInt ;
43+
44+ PROCEDURE newInt ( value: INTEGER ): Integer;
45+ VAR res: Integer;
46+ BEGIN
47+ NEW ( res);
48+ res. value := value;
49+ res. compare := compareInt;
50+ res. print := printInt;
51+ RETURN res
52+ END newInt ;
53+
54+ PROCEDURE insert ( l: List; o: Object);
55+ VAR e: Element;
56+ BEGIN
57+ NEW ( e);
58+ e. value := o;
59+ e. next := NIL ;
60+ IF l. first # NIL THEN
61+ l. last. next := e
62+ ELSE
63+ l. first := e
64+ END ;
65+ l. last := e
66+ END insert ;
67+
68+ PROCEDURE delete ( l: List; o: Object);
69+ VAR cur, prev: Element;
70+ val: Object;
71+ BEGIN
72+ cur := l. first;
73+ prev := NIL ;
74+ WHILE cur # NIL DO
75+ val := cur. value;
76+ IF val. compare( val, o) = 0 THEN
77+ IF prev # NIL THEN
78+ prev. next := cur. next;
79+ IF cur = l. last THEN
80+ l. last := prev
81+ END
82+ ELSE
83+ l. first := cur. next
84+ END ;
85+ DISPOSE ( cur. value);
86+ DISPOSE ( cur);
87+ EXIT
88+ ELSE
89+ prev := cur;
90+ cur := cur. next
91+ END
92+ END
93+ END delete ;
94+
95+ PROCEDURE print ( l: List);
96+ VAR cur: Element;
97+ val: Object;
98+ BEGIN
99+ cur := l. first;
100+ Out. Char( " [" );
101+ WHILE cur # NIL DO
102+ val := cur. value;
103+ val. print( val);
104+ cur := cur. next;
105+ IF ( cur # NIL ) THEN Out. Char( " ," ) END
106+ END ;
107+ Out. Char( " ]" )
108+ END print ;
109+
110+ PROCEDURE newList *(): List;
111+ VAR l: List;
112+ BEGIN
113+ NEW ( l);
114+ l. first := NIL ; l. last := NIL ;
115+ l. insert := insert;
116+ l. delete := delete;
117+ l. print := print;
118+ RETURN l
119+ END newList ;
120+
121+ PROCEDURE deleteList *( l: List);
122+ VAR cur, tmp: Element;
123+ BEGIN
124+ cur := l. first;
125+ WHILE cur # NIL DO
126+ tmp := cur;
127+ cur := cur. next;
128+ DISPOSE ( tmp. value);
129+ DISPOSE ( tmp)
130+ END ;
131+ DISPOSE ( l)
132+ END deleteList ;
133+
134+ BEGIN
135+ l := newList();
136+ l. print( l); Out. Ln;
137+ FOR i := 0 TO 9 DO
138+ l. insert( l, newInt( i))
139+ END ;
140+ l. print( l); Out. Ln;
141+ l. delete( l, newInt( 0 ));
142+ l. delete( l, newInt( 5 ));
143+ l. delete( l, newInt( 9 ));
144+ l. print( l); Out. Ln;
145+ deleteList( l)
146+ END List .
0 commit comments