gitweb on Svarog

projekti pod git sistemom za održavanje verzija -- projects under the git version control system
skripta verzija 14c
[spa1skripta-public.git] / kodovi / liste2.mod
1 MODULE liste2;
2 FROM InOut IMPORT WriteString, WriteLn,
3 WriteCard, ReadCard;
4 FROM IO IMPORT RdKey;
5 FROM Storage IMPORT ALLOCATE, DEALLOCATE;
6 TYPE
7 skupZn = SET OF CHAR;
8 brojevi = POINTER TO brojSlog;
9 brojSlog = RECORD
10 info:CARDINAL;
11 veza:brojevi;
12 END;
13 VAR
14 lista : brojevi;
15 menu,prazno:CHAR;
17 PROCEDURE DodajPoc(VAR lista:brojevi; br:INTEGER);
18 (* dodaje broj pom na pocetak liste *)
19 VAR
20 temp:brojevi;
21 BEGIN
22 (* kreiramo novi element *)
23 NEW(temp);
24 temp^.info := br;
25 (* treba da pokazuje na ostatak liste *)
26 temp^.veza := lista;
27 (* pocetak liste je novi element *)
28 lista := temp;
29 END DodajPoc;
31 PROCEDURE Unos(VAR lista:brojevi);
32 (* dodaje n brojeva u listu *)
33 VAR
34 n,i,br:CARDINAL;
35 BEGIN
36 WriteString('unesite n (broj brojeva): ');
37 ReadCard(n);
38 FOR i:= 1 TO n DO
39 WriteString("unesite broj ");
40 WriteCard(i,0);
41 WriteString(": ");
42 ReadCard(br);
43 DodajPoc(lista,br);
44 END;
45 END Unos;
47 (* -- procedure za stampu -- *)
49 PROCEDURE Stampaj(lista:brojevi);
50 (* stampa sadrzaj liste na ekran *)
51 VAR
52 temp:brojevi;
53 BEGIN
54 WriteLn;
55 WriteString("Sadrzaj liste:");
56 WriteLn;
57 temp:=lista;
58 WHILE temp # NIL DO
59 WriteCard(temp^.info,0);
60 WriteLn;
61 temp := temp^.veza;
62 END;
63 END Stampaj;
65 PROCEDURE StampajK(VAR lista:brojevi);
66 (* stampa k-ti element (k unosi korisnik) *)
67 VAR
68 temp:brojevi;
69 k,brojac:CARDINAL;
70 BEGIN
71 WriteString("unesite redni broj elementa:");
72 ReadCard(k);
73 temp:=lista;
74 brojac := 1;
75 WHILE (temp# NIL) AND (k>brojac) DO
76 temp:=temp^.veza;
77 INC(brojac);
78 END;
79 IF (temp#NIL) THEN
80 WriteCard(temp^.info,2);
81 ELSE
82 WriteString("greska! - ne postoji element");
83 WriteString(" u listi sa rednim brojem ");
84 WriteCard(k,2);
85 END;
86 WriteLn();
87 END StampajK;
89 PROCEDURE StampajMinimum(VAR lista:brojevi);
90 (* nalazi i stampa minimalni element liste *)
91 VAR
92 temp:brojevi;
93 min:CARDINAL;
94 BEGIN
95 IF (lista=NIL) THEN
96 WriteString("prazna lista!");
97 ELSE
98 min:=lista^.info;
99 temp:=lista^.veza;
100 WHILE temp # NIL DO
101 IF temp^.info < min THEN
102 min := temp^.info;
103 END;
104 temp := temp^.veza;
105 END;
106 WriteString("Minimalni element liste je ");
107 WriteCard(min,0);
108 END;
109 WriteLn;
110 END StampajMinimum;
112 (* -- pomocne procedure, bez ispisa -- *)
114 PROCEDURE UListi(lista:brojevi;
115 br: CARDINAL):BOOLEAN;
116 (* vraca da li se 'br' nalazi u listi 'lista' *)
117 VAR
118 temp:brojevi;
119 BEGIN
120 temp:=lista;
121 WHILE (temp # NIL) AND (temp^.info # br) DO
122 (* dok ne dodjemo do kraja liste
123 ili ne nadjemo broj *)
124 temp := temp^.veza;
125 END;
126 IF temp#NIL THEN
127 (* znaci da nismo na kraju liste,
128 tj da je nadjen broj *)
129 RETURN TRUE;
130 ELSE (* temp = NIL *)
131 RETURN FALSE;
132 END;
133 END UListi;
135 PROCEDURE IzbaciIzListe(VAR lista:brojevi;
136 br: CARDINAL):BOOLEAN;
137 (* izbacuje broj 'br' iz liste, naravno ako
138 postoji i vraca da li je operacija uspesno
139 obavljena *)
140 VAR
141 temp,prethodni:brojevi;
142 BEGIN
143 (* proverimo da li je prvi element *)
144 IF (lista # NIL) AND (lista^.info = br) THEN
145 temp:=lista;
146 lista :=lista^.veza;
147 DISPOSE(temp);
148 RETURN TRUE;
149 ELSE
150 (* trazimo u ostatku liste *)
151 temp:=lista;
152 prethodni:=NIL;
153 WHILE (temp # NIL) AND (temp^.info # br) DO
154 (* dok ne dodjemo do kraja liste
155 ili ne nadjemo broj *)
156 prethodni:=temp;
157 temp := temp^.veza;
158 END;
159 IF temp#NIL THEN
160 (* znaci da nismo na kraju liste,
161 odnosno da smo nasli broj *)
162 (* prevezemo listu oko elementa *)
163 prethodni^.veza:=temp^.veza;
164 DISPOSE(temp);
165 RETURN TRUE;
166 ELSE
167 RETURN FALSE;
168 END;
169 END;
170 END IzbaciIzListe;
172 PROCEDURE IzbaciIzListeSve(VAR lista:brojevi;
173 br: CARDINAL):CARDINAL;
174 (* izbacuje sve brojeve 'br' iz liste, naravno ako
175 postoje i vraca koliko ih je bilo *)
176 VAR
177 temp,prethodni:brojevi;
178 brojac : CARDINAL;
179 BEGIN
180 brojac := 0;
181 (* uklanjamo sa pocetka koliko je potrebno *)
182 WHILE (lista # NIL) AND (lista^.info = br) DO
183 temp:=lista;
184 lista :=lista^.veza;
185 DISPOSE(temp);
186 INC(brojac);
187 END;
188 (* trazimo u ostatku liste *)
189 IF (lista # NIL) THEN
190 temp:=lista;
191 WHILE (temp^.veza # NIL) DO
192 (* idemo do poslednjeg elementa liste *)
193 prethodni:=temp;
194 temp := temp^.veza;
195 IF temp^.info = br THEN
196 (* prevezemo listu oko elementa *)
197 prethodni^.veza:=temp^.veza;
198 DISPOSE(temp);
199 INC(brojac);
200 (* vracamo se jedan korak da bi
201 u novom krugu proverili i ovaj element *)
202 temp := prethodni;
203 END;
204 END;
205 END;
206 RETURN brojac;
207 END IzbaciIzListeSve;
209 (* - procedure sa interakcijom sa korisnikom - *)
211 PROCEDURE IzbacivanjeEl(VAR lista:brojevi);
212 (* izbacuje uneti broj iz liste koristeci proceduru IzbaciIzListe *)
213 VAR
214 br:CARDINAL;
215 BEGIN
216 WriteString("unesite broj za izbacivanje: ");
217 ReadCard(br);
218 IF IzbaciIzListe(lista,br) THEN
219 WriteString("broj je izbacen iz liste");
220 ELSE
221 WriteString("greska! - broj ne postoji");
222 END;
223 WriteLn;
224 END IzbacivanjeEl;
226 PROCEDURE IzbacivanjeElSvi(VAR lista:brojevi);
227 (* izbacuje sve primeke unetog broj iz liste
228 koristeci proceduru IzbaciIzListeSve *)
229 VAR
230 br, ukupno:CARDINAL;
231 BEGIN
232 WriteString("unesite broj za izbacivanje: ");
233 ReadCard(br);
234 ukupno := IzbaciIzListeSve(lista,br);
235 WriteString("Iz liste je izbaceno ");
236 WriteCard(ukupno,3);
237 WriteString(" el.");
238 WriteLn;
239 END IzbacivanjeElSvi;
241 PROCEDURE IzbacivanjeK(VAR lista:brojevi);
242 (* izbacuje k-ti element iz liste *)
243 VAR
244 temp,tekuci:brojevi;
245 k,brojac:CARDINAL;
246 BEGIN
247 IF lista=NIL THEN
248 WriteString("lista je prazna, nema ");
249 WriteString("elemenata za izbacivanje");
250 ELSE
251 WriteString("unesite redni broj elementa");
252 WriteString(" koji zelite izbaciti:");
253 ReadCard(k);
254 IF k=1 THEN (*izbacivanje prvog *)
255 temp:=lista;
256 lista := lista^.veza;
257 DISPOSE(temp);
258 ELSE
259 tekuci := lista;
260 brojac := 2; (*gledamo jedan unapred*)
261 WHILE (tekuci^.veza# NIL) AND (k>brojac) DO
262 (* idemo kroz listu do k-tog el *)
263 tekuci:=tekuci^.veza;
264 INC(brojac);
265 END;
266 IF (tekuci^.veza#NIL) THEN
267 (* pamtimo element za brisanje *)
268 temp:=tekuci^.veza;
269 (* prevezujemo listu oko njega*)
270 tekuci^.veza:=tekuci^.veza^.veza;
271 DISPOSE(temp);
272 ELSE
273 WriteString("greska! - ne postoji el ");
274 WriteString("u listi sa rednim brojem ");
275 WriteCard(k,2);
276 END;
277 WriteLn();
278 END;
279 END;
280 END IzbacivanjeK;
282 PROCEDURE Pretraga(lista:brojevi);
283 (* provera da li se uneti broj nalazi u listi *)
284 VAR
285 br:CARDINAL;
286 BEGIN
287 WriteString("unesite trazeni broj");
288 ReadCard(br);
289 IF UListi(lista,br) THEN
290 WriteString("broj postoji u listi");
291 ELSE
292 WriteString("broj ne postoji u listi");
293 END;
294 WriteLn;
295 END Pretraga;
297 (* -- oslobadjanje memorije -- *)
299 PROCEDURE Unisti(VAR lista:brojevi);
300 VAR
301 temp:brojevi;
302 BEGIN
303 temp:=lista;
304 WHILE temp # NIL DO
305 lista:=lista^.veza;
306 DISPOSE(temp);
307 temp:=lista;
308 END;
309 END Unisti;
311 BEGIN
312 (* pocinjemo od prazne liste *)
313 lista := NIL;
314 REPEAT
315 WriteLn;
316 WriteString("Ilustracija rada sa");
317 WriteString(" listama brojeva");
318 WriteLn;
319 WriteString("=============================");
320 WriteLn;
321 WriteString("s - Stampa");WriteLn;
322 WriteString("u - Unos");WriteLn;
323 WriteString("i - Izbacivanje br iz liste");
324 WriteLn;
325 WriteString("v - izbacivanje svih br iz liste");
326 WriteLn;
327 WriteString("e - izbacivanje k-tog El.");
328 WriteLn;
329 WriteString("k - stampanje k-tog elementa");
330 WriteLn;
331 WriteString("m - Minimalni broj u listi");
332 WriteLn;
333 WriteString("p - Pretraga el. u listi");
334 WriteLn;
335 WriteLn;
336 WriteString("q - kraj rada (Quit)");WriteLn;
337 REPEAT
338 menu := CAP(RdKey());
339 UNTIL menu IN skupZn{'S','U','E','I','V',
340 'M','K','P','Q'};
341 IF menu#'Q' THEN
342 CASE menu OF
343 'S' : Stampaj(lista);|
344 'U' : Unos(lista);|
345 'I' : IzbacivanjeEl(lista);|
346 'V' : IzbacivanjeElSvi(lista);|
347 'E' : IzbacivanjeK(lista);|
348 'K' : StampajK(lista); |
349 'M' : StampajMinimum(lista); |
350 'P' : Pretraga(lista);|
351 END;
352 WriteLn;
353 WriteString("--- pritisnite bilo koji ");
354 WriteString("taster za povratak u meni");
355 prazno:=RdKey();
356 ELSE
357 WriteString("Kraj rada")
358 END;
359 WriteLn;
360 UNTIL menu='Q';
361 Unisti(lista);
362 END liste2.
Svarog.pmf.uns.ac.rs/gitweb maintanance Doni Pracner