gitweb on Svarog

projekti pod git sistemom za održavanje verzija -- projects under the git version control system
liste, dodata jos dva programa
[spa1-materijali.git] / kodovi / liste / ListePrimeriOperacija.java
1 import org.svetovid.io.SvetovidIOException;
3 /**
4 * Primer razlicitih operacija nad listama. Program je predstavljen kao
5 * interaktivni meni radi boljeg ilustrovanja operacija i njihovog ucinka.
6 */
7 public class ListePrimeriOperacija {
8 static ListaBrojevaBr lista;
10 public static void main(String[] args) {
11 // inicijalizujemo listu
12 lista = new ListaBrojevaBr();
14 char menu = 'a';
16 while (menu != 'Q') {
17 System.out.println();
18 System.out.println("Ilustracija rada sa listama brojeva");
19 System.out.println("======================================");
20 System.out.println("s-Stampa");
21 System.out.println("u-Unos liste");
22 System.out.println("k-Stampanje k-tog elementa");
23 System.out.println("d-dodavanje elementa na pocetak");
24 System.out.println("o-dodavanje elementa na k-to mesto");
25 System.out.println("i-Izbacivanje br iz liste");
26 System.out.println("v-Izbacivanje svih br iz liste");
27 System.out.println("e-Izbacivanje k-tog elementa");
28 System.out.println("m-Minimalni broj u listi");
29 System.out.println("p-Pretraga elementa u listi");
30 System.out.println();
31 System.out.println("q-Kraj rada (Quit)");
32 menu = Svetovid.in.readChar();
33 menu = Character.toUpperCase(menu);
34 switch (menu) {
35 case 'S':
36 lista.stampajNaEkran();
37 break;
38 case 'U':
39 unosBrojeva();
40 break;
41 case 'D':
42 int broj = Svetovid.in.readInt("Broj koji dodajete:");
43 lista.dodajNaPocetak(broj);
44 break;
45 case 'O':
46 broj = Svetovid.in.readInt("Broj koji dodajete:");
47 int pos = Svetovid.in.readInt("Pozicija na koju dodajete:");
48 lista.dodaj(broj, pos);
49 break;
50 case 'I':
51 izbacivanjeEl();
52 break;
53 case 'V':
54 izbacivanjeElSvi();
55 break;
56 case 'E':
57 izbacivanjeK();
58 break;
59 case 'K':
60 stampajK(lista);
61 break;
62 case 'M':
63 Svetovid.out.println("Minimum liste je:" + lista.minimum());
64 break;
65 case 'P':
66 pretraga();
67 break;
68 default:
69 break;
70 }
71 if (menu != 'Q') {
72 Svetovid.out.println(" -- enter za povratak u meni --");
73 Svetovid.in.readLine();
74 }
75 }
76 }
78 static void unosBrojeva() {
79 System.out.println("unesite n (broj brojeva): ");
80 int n = Svetovid.in.readInt();
81 System.out.println("unesite brojeve");
82 for (int i = 0; i < n; i++) {
83 int br = Svetovid.in.readInt();
84 lista.dodajNaPocetak(br);
85 }
86 }
88 static void pretraga() {
89 int broj = Svetovid.in.readInt("Unesite broj koji trazite:");
90 if (lista.uListi(broj)) {
91 Svetovid.out.println("Broj postoji u listi");
92 } else {
93 Svetovid.out.println("Broj ne postoji u listi");
94 }
95 }
97 static void stampajK(ListaBrojevaBr lista2) {
98 int broj = Svetovid.in
99 .readInt("Unesite redni broj elementa koji zelite:");
100 try {
101 Svetovid.out.println("Element na mestu " + broj + " je "
102 + lista.element(broj));
103 } catch (Exception e) {
104 Svetovid.out.println("Greska: " + e.getMessage());
109 static void izbacivanjeK() {
110 int broj = Svetovid.in.readInt("Unesite poziciju koju treba izbaciti:");
111 if (lista.izbaciK(broj)) {
112 Svetovid.out.println("Pozicija je izbacena iz liste");
113 } else {
114 Svetovid.out.println("Pozicija ne postoji u listi");
118 static void izbacivanjeElSvi() {
119 int broj = Svetovid.in.readInt("Unesite broj koji treba izbaciti:");
121 Svetovid.out.println("Izbaceno je " + lista.izbaciIzListeSve(broj)
122 + "brojeva");
126 static void izbacivanjeEl() {
127 int broj = Svetovid.in.readInt("Unesite broj koji treba izbaciti:");
128 if (lista.izbaciIzListe(broj)) {
129 Svetovid.out.println("Broj je izbacen iz liste");
130 } else {
131 Svetovid.out.println("Broj ne postoji u listi");
137 /**
138 * Povezana lista brojeva sa operacijama nad njom i brojace elemenata. Lista u
139 * svakom momentu moze da efikasno vrati broj elemenata u njoj.
140 */
141 class ListaBrojevaBr {
142 class Element {
143 int info;
144 Element veza;
146 public Element(int br) {
147 this.info = br;
148 this.veza = null;
151 public String toString() {
152 return info + "";
156 // pokazivac na prvi element liste
157 Element prvi;
159 // interni brojac koji pomaze kod nekih operacija
160 int brojElemenata;
162 /** Kreira praznu listu brojeva. */
163 public ListaBrojevaBr() {
164 this.prvi = null;
165 this.brojElemenata = 0;
168 /** vraca broj elemenata u listi */
169 public int velicina() {
170 return brojElemenata;
173 /** Vraca da li je lista prazna */
174 public boolean jePrazna() {
175 return prvi == null;
178 public void dodajNaPocetak(int br) {
179 Element novi = new Element(br);
180 novi.veza = prvi;
181 prvi = novi;
182 brojElemenata++;
185 public void stampajNaEkran() {
186 if (prvi == null) {
187 Svetovid.out.println("Lista je prazna");
188 } else {
189 Svetovid.out.println("Sadrzaj liste duzine:"+velicina());
190 Element tekuci = prvi;
191 while (tekuci != null) {
192 System.out.println(tekuci.info);
193 tekuci = tekuci.veza;
195 System.out.println();
199 public String toString() {
200 String rez = "Lista: [ ";
201 Element tekuci = prvi;
202 while (tekuci != null) {
203 rez += tekuci.info + " ";
204 tekuci = tekuci.veza;
206 rez += "]";
207 return rez;
210 /**
211 * Vraca vrednost k-tog elementa. Prvi element liste je na mestu 0, drugi na
212 * mestu 1 i tako dalje. Ne postoje elementi na negativnim pozicijama. U
213 * slucaju nepostojeceg indeksa baca IndexOutOfBounds izuzetak.
214 *
215 * @throws IndexOutOfBoundsException
216 */
217 public int element(int k) {
218 if (k < 0) {
219 throw new IndexOutOfBoundsException(
220 "Ne postoje elementi na negativnim pozicijama!");
223 if (k < brojElemenata) {
224 Element tekuci = prvi;
225 int br = 0;
226 while (br < k) {
227 tekuci = tekuci.veza;
228 br++;
230 return tekuci.info;
231 } else {
232 throw new IndexOutOfBoundsException("Lista je kraca od "
233 + k);
237 // alternativna verzija procedure koja bi radila ako nemamo brojElemenata
238 // kao polje
239 public int elementB(int k) {
240 if (k < 0) {
241 throw new IndexOutOfBoundsException(
242 "Ne postoje elementi na negativnim pozicijama!");
245 Element tekuci = prvi;
246 int brojac = 0;
248 while (tekuci != null && k > brojac) {
249 tekuci = tekuci.veza;
250 brojac++;
253 if (tekuci != null) {
254 return tekuci.info;
255 } else {
256 throw new IndexOutOfBoundsException("Lista je kraca od "
257 + k);
261 /** Vraca minimum liste. U slucaju prazne liste vratice maksimalni Integer. */
262 public int minimum() {
263 int min = Integer.MAX_VALUE;
265 Element tekuci = prvi;
266 while (tekuci != null) {
267 if (tekuci.info < min) {
268 min = tekuci.info;
270 tekuci = tekuci.veza;
273 return min;
276 /** Vraca da li broj br postoji u listi. */
277 public boolean uListi(int br) {
278 Element tekuci = prvi;
279 while (tekuci != null && tekuci.info != br) {
280 tekuci = tekuci.veza;
283 // ako smo dosli do kraja liste i nismo ga nasli
284 // tekuci ce biti jednako null
285 return tekuci != null;
288 /**
289 * Dodaje broj 'br' na poziciju 'pos'. Ako je pozicija negativna, broj ce
290 * biti dodat na prvo mesto. Ako je pozicija veza od broja elemenata, broj
291 * ce biti dodat na poslednje mesto.
292 *
293 * @param br
294 * broj koji se dodaje u listu
295 * @param pos
296 * pozicija na koju se broj dodaje
297 */
298 public void dodaj(int br, int pos) {
299 Element novi = new Element(br);
301 // proverimo i popravimo pos po potrebi
302 if (pos < 0)
303 pos = 0;
304 if (pos > brojElemenata) {
305 pos = brojElemenata;
308 // dodavanje na pocetak je jednostavno
309 if (pos == 0) {
310 novi.veza = prvi;
311 prvi = novi;
312 brojElemenata++;
313 } else {
314 // inace nam treba prethodni element
315 Element prethodni = prvi;
316 int brojac = 0;
317 while (prethodni != null && brojac < pos - 1) {
318 prethodni = prethodni.veza;
319 brojac++;
321 novi.veza = prethodni.veza;
322 prethodni.veza = novi;
323 brojElemenata++;
327 /**
328 * Izbacuje broj 'br' iz liste, naravno ako postoji i vraca da li je
329 * operacija uspesno obavljena.
330 */
331 public boolean izbaciIzListe(int br) {
332 // proverimo da li je prvi element
333 if (prvi != null && prvi.info == br) {
334 prvi = prvi.veza;
335 return true;
336 } else {
337 /* trazimo u ostatku liste */
338 Element tekuci, prethodni;
339 tekuci = prvi;
340 prethodni = null;
341 while (tekuci != null && tekuci.info != br) {
342 /*
343 * dok ne dodjemo do kraja liste ili ne nadjemo broj
344 */
345 prethodni = tekuci;
346 tekuci = tekuci.veza;
348 if (tekuci != null) {
349 /*
350 * znaci da nismo na kraju liste, odnosno da smo nasli broj,
351 * prevezemo listu oko elementa
352 */
353 prethodni.veza = tekuci.veza;
354 brojElemenata--;
355 return true;
356 } else {
357 return false;
362 /**
363 * Izbacuje sve brojeve 'br' iz liste, naravno ako postoje i vraca koliko ih
364 * je bilo.
365 */
366 public int izbaciIzListeSve(int br) {
367 int brojac = 0;
369 /* uklanjamo sa pocetka koliko je potrebno */
370 while (prvi != null && prvi.info == br) {
371 prvi = prvi.veza;
372 brojac++;
375 Element tekuci, prethodni;
376 /* trazimo u ostatku liste */
377 if (prvi != null) {
378 tekuci = prvi;
379 while (tekuci.veza != null) {
380 /* idemo korak po korak do poslednjeg elementa liste */
381 prethodni = tekuci;
382 tekuci = tekuci.veza;
383 if (tekuci.info == br) {
384 /* prevezemo listu oko elementa */
385 prethodni.veza = tekuci.veza;
386 brojac++;
387 /*
388 * vracamo se jedan korak da bi u novom krugu proverili i
389 * ovaj element
390 */
391 tekuci = prethodni;
395 brojElemenata -= brojac;
396 return brojac;
399 /**
400 * Izbacuje K-ti element iz liste. Vraca da li je uspesno izbacen. Ako je
401 * lista prekratka vratice false.
402 */
403 public boolean izbaciK(int k) {
404 if (k >= brojElemenata) {
405 return false;
407 if (k < 0) {
408 return false;
410 // da li izbacujemo prvog?
411 if (k == 0) {
412 prvi = prvi.veza;
413 } else {
414 // brojimo do elementa pre onog koji izbacujemo
415 Element prethodni = prvi;
416 int brojac = 0;
418 while (k - 1 > brojac) {
419 prethodni = prethodni.veza;
420 brojac++;
422 // prevezemo oko k
423 prethodni.veza = prethodni.veza.veza;
425 brojElemenata--;
426 return true;
Svarog.pmf.uns.ac.rs/gitweb maintanance Doni Pracner