gitweb on Svarog

projekti pod git sistemom za održavanje verzija -- projects under the git version control system
b655e7bb44385d0b92fb71c2265bf4f406638209
[spa1-materijali.git] / kodovi / liste / ListePrimeriOperacija.java
1 /**
2 * Primer razlicitih operacija nad listama. Program je predstavljen kao
3 * interaktivni meni radi boljeg ilustrovanja operacija i njihovog ucinka.
4 */
5 public class ListePrimeriOperacija {
6 static ListaBrojevaBr lista;
8 public static void main(String[] args) {
9 // inicijalizujemo listu
10 lista = new ListaBrojevaBr();
12 char menu = 'a';
14 while (menu != 'Q') {
15 System.out.println();
16 System.out.println("Ilustracija rada sa listama brojeva");
17 System.out.println("======================================");
18 System.out.println("s-Stampa");
19 System.out.println("u-Unos liste");
20 System.out.println("k-Stampanje k-tog elementa");
21 System.out.println("d-dodavanje elementa na pocetak");
22 System.out.println("o-dodavanje elementa na k-to mesto");
23 System.out.println("i-Izbacivanje br iz liste");
24 System.out.println("v-Izbacivanje svih br iz liste");
25 System.out.println("e-Izbacivanje k-tog elementa");
26 System.out.println("m-Minimalni broj u listi");
27 System.out.println("p-Pretraga elementa u listi");
28 System.out.println();
29 System.out.println("q-Kraj rada (Quit)");
30 menu = Svetovid.in.readChar();
31 menu = Character.toUpperCase(menu);
32 switch (menu) {
33 case 'S':
34 lista.stampajNaEkran();
35 break;
36 case 'U':
37 unosBrojeva();
38 break;
39 case 'D':
40 int broj = Svetovid.in.readInt("Broj koji dodajete:");
41 lista.dodajNaPocetak(broj);
42 break;
43 case 'O':
44 broj = Svetovid.in.readInt("Broj koji dodajete:");
45 int pos = Svetovid.in.readInt("Pozicija na koju dodajete:");
46 lista.dodaj(broj, pos);
47 break;
48 case 'I':
49 izbacivanjeEl();
50 break;
51 case 'V':
52 izbacivanjeElSvi();
53 break;
54 case 'E':
55 izbacivanjeK();
56 break;
57 case 'K':
58 stampajK(lista);
59 break;
60 case 'M':
61 Svetovid.out.println("Minimum liste je:" + lista.minimum());
62 break;
63 case 'P':
64 pretraga();
65 break;
66 default:
67 break;
68 }
69 if (menu != 'Q') {
70 Svetovid.out.println(" -- enter za povratak u meni --");
71 Svetovid.in.readLine();
72 }
73 }
74 }
76 static void unosBrojeva() {
77 System.out.println("unesite n (broj brojeva): ");
78 int n = Svetovid.in.readInt();
79 System.out.println("unesite brojeve");
80 for (int i = 0; i < n; i++) {
81 int br = Svetovid.in.readInt();
82 lista.dodajNaPocetak(br);
83 }
84 }
86 static void pretraga() {
87 int broj = Svetovid.in.readInt("Unesite broj koji trazite:");
88 if (lista.uListi(broj)) {
89 Svetovid.out.println("Broj postoji u listi");
90 } else {
91 Svetovid.out.println("Broj ne postoji u listi");
92 }
93 }
95 static void stampajK(ListaBrojevaBr lista2) {
96 int broj = Svetovid.in
97 .readInt("Unesite redni broj elementa koji zelite:");
98 try {
99 Svetovid.out.println("Element na mestu " + broj + " je "
100 + lista.element(broj));
101 } catch (Exception e) {
102 Svetovid.out.println("Greska: " + e.getMessage());
107 static void izbacivanjeK() {
108 int broj = Svetovid.in.readInt("Unesite poziciju koju treba izbaciti:");
109 if (lista.izbaciK(broj)) {
110 Svetovid.out.println("Pozicija je izbacena iz liste");
111 } else {
112 Svetovid.out.println("Pozicija ne postoji u listi");
116 static void izbacivanjeElSvi() {
117 int broj = Svetovid.in.readInt("Unesite broj koji treba izbaciti:");
119 Svetovid.out.println("Izbaceno je " + lista.izbaciIzListeSve(broj)
120 + "brojeva");
124 static void izbacivanjeEl() {
125 int broj = Svetovid.in.readInt("Unesite broj koji treba izbaciti:");
126 if (lista.izbaciIzListe(broj)) {
127 Svetovid.out.println("Broj je izbacen iz liste");
128 } else {
129 Svetovid.out.println("Broj ne postoji u listi");
135 /**
136 * Povezana lista brojeva sa operacijama nad njom i brojace elemenata. Lista u
137 * svakom momentu moze da efikasno vrati broj elemenata u njoj.
138 */
139 class ListaBrojevaBr {
140 class Element {
141 int info;
142 Element veza;
144 public Element(int br) {
145 this.info = br;
146 this.veza = null;
149 public String toString() {
150 return info + "";
154 // pokazivac na prvi element liste
155 Element prvi;
157 // interni brojac koji pomaze kod nekih operacija
158 int brojElemenata;
160 /** Kreira praznu listu brojeva. */
161 public ListaBrojevaBr() {
162 this.prvi = null;
163 this.brojElemenata = 0;
166 /** vraca broj elemenata u listi */
167 public int velicina() {
168 return brojElemenata;
171 /** Vraca da li je lista prazna */
172 public boolean jePrazna() {
173 return prvi == null;
176 public void dodajNaPocetak(int br) {
177 Element novi = new Element(br);
178 novi.veza = prvi;
179 prvi = novi;
180 brojElemenata++;
183 public void stampajNaEkran() {
184 if (prvi == null) {
185 Svetovid.out.println("Lista je prazna");
186 } else {
187 Svetovid.out.println("Sadrzaj liste duzine:"+velicina());
188 Element tekuci = prvi;
189 while (tekuci != null) {
190 System.out.println(tekuci.info);
191 tekuci = tekuci.veza;
193 System.out.println();
197 public String toString() {
198 String rez = "Lista: [ ";
199 Element tekuci = prvi;
200 while (tekuci != null) {
201 rez += tekuci.info + " ";
202 tekuci = tekuci.veza;
204 rez += "]";
205 return rez;
208 /**
209 * Vraca vrednost k-tog elementa. Prvi element liste je na mestu 0, drugi na
210 * mestu 1 i tako dalje. Ne postoje elementi na negativnim pozicijama. U
211 * slucaju nepostojeceg indeksa baca IndexOutOfBounds izuzetak.
212 *
213 * @throws IndexOutOfBoundsException
214 */
215 public int element(int k) {
216 if (k < 0) {
217 throw new IndexOutOfBoundsException(
218 "Ne postoje elementi na negativnim pozicijama!");
221 if (k < brojElemenata) {
222 Element tekuci = prvi;
223 int br = 0;
224 while (br < k) {
225 tekuci = tekuci.veza;
226 br++;
228 return tekuci.info;
229 } else {
230 throw new IndexOutOfBoundsException("Lista je kraca od "
231 + k);
235 // alternativna verzija procedure koja bi radila ako nemamo brojElemenata
236 // kao polje
237 public int elementB(int k) {
238 if (k < 0) {
239 throw new IndexOutOfBoundsException(
240 "Ne postoje elementi na negativnim pozicijama!");
243 Element tekuci = prvi;
244 int brojac = 0;
246 while (tekuci != null && k > brojac) {
247 tekuci = tekuci.veza;
248 brojac++;
251 if (tekuci != null) {
252 return tekuci.info;
253 } else {
254 throw new IndexOutOfBoundsException("Lista je kraca od "
255 + k);
259 /** Vraca minimum liste. U slucaju prazne liste vratice maksimalni Integer. */
260 public int minimum() {
261 int min = Integer.MAX_VALUE;
263 Element tekuci = prvi;
264 while (tekuci != null) {
265 if (tekuci.info < min) {
266 min = tekuci.info;
268 tekuci = tekuci.veza;
271 return min;
274 /** Vraca da li broj br postoji u listi. */
275 public boolean uListi(int br) {
276 Element tekuci = prvi;
277 while (tekuci != null && tekuci.info != br) {
278 tekuci = tekuci.veza;
281 // ako smo dosli do kraja liste i nismo ga nasli
282 // tekuci ce biti jednako null
283 return tekuci != null;
286 /**
287 * Dodaje broj 'br' na poziciju 'pos'. Ako je pozicija negativna, broj ce
288 * biti dodat na prvo mesto. Ako je pozicija veza od broja elemenata, broj
289 * ce biti dodat na poslednje mesto.
290 *
291 * @param br
292 * broj koji se dodaje u listu
293 * @param pos
294 * pozicija na koju se broj dodaje
295 */
296 public void dodaj(int br, int pos) {
297 Element novi = new Element(br);
299 // proverimo i popravimo pos po potrebi
300 if (pos < 0)
301 pos = 0;
302 if (pos > brojElemenata) {
303 pos = brojElemenata;
306 // dodavanje na pocetak je jednostavno
307 if (pos == 0) {
308 novi.veza = prvi;
309 prvi = novi;
310 brojElemenata++;
311 } else {
312 // inace nam treba prethodni element
313 Element prethodni = prvi;
314 int brojac = 0;
315 while (prethodni != null && brojac < pos - 1) {
316 prethodni = prethodni.veza;
317 brojac++;
319 novi.veza = prethodni.veza;
320 prethodni.veza = novi;
321 brojElemenata++;
325 /**
326 * Izbacuje broj 'br' iz liste, naravno ako postoji i vraca da li je
327 * operacija uspesno obavljena.
328 */
329 public boolean izbaciIzListe(int br) {
330 // proverimo da li je prvi element
331 if (prvi != null && prvi.info == br) {
332 prvi = prvi.veza;
333 return true;
334 } else {
335 /* trazimo u ostatku liste */
336 Element tekuci, prethodni;
337 tekuci = prvi;
338 prethodni = null;
339 while (tekuci != null && tekuci.info != br) {
340 /*
341 * dok ne dodjemo do kraja liste ili ne nadjemo broj
342 */
343 prethodni = tekuci;
344 tekuci = tekuci.veza;
346 if (tekuci != null) {
347 /*
348 * znaci da nismo na kraju liste, odnosno da smo nasli broj,
349 * prevezemo listu oko elementa
350 */
351 prethodni.veza = tekuci.veza;
352 brojElemenata--;
353 return true;
354 } else {
355 return false;
360 /**
361 * Izbacuje sve brojeve 'br' iz liste, naravno ako postoje i vraca koliko ih
362 * je bilo.
363 */
364 public int izbaciIzListeSve(int br) {
365 int brojac = 0;
367 /* uklanjamo sa pocetka koliko je potrebno */
368 while (prvi != null && prvi.info == br) {
369 prvi = prvi.veza;
370 brojac++;
373 Element tekuci, prethodni;
374 /* trazimo u ostatku liste */
375 if (prvi != null) {
376 tekuci = prvi;
377 while (tekuci.veza != null) {
378 /* idemo korak po korak do poslednjeg elementa liste */
379 prethodni = tekuci;
380 tekuci = tekuci.veza;
381 if (tekuci.info == br) {
382 /* prevezemo listu oko elementa */
383 prethodni.veza = tekuci.veza;
384 brojac++;
385 /*
386 * vracamo se jedan korak da bi u novom krugu proverili i
387 * ovaj element
388 */
389 tekuci = prethodni;
393 brojElemenata -= brojac;
394 return brojac;
397 /**
398 * Izbacuje K-ti element iz liste. Vraca da li je uspesno izbacen. Ako je
399 * lista prekratka vratice false.
400 */
401 public boolean izbaciK(int k) {
402 if (k >= brojElemenata) {
403 return false;
405 if (k < 0) {
406 return false;
408 // da li izbacujemo prvog?
409 if (k == 0) {
410 prvi = prvi.veza;
411 } else {
412 // brojimo do elementa pre onog koji izbacujemo
413 Element prethodni = prvi;
414 int brojac = 0;
416 while (k - 1 > brojac) {
417 prethodni = prethodni.veza;
418 brojac++;
420 // prevezemo oko k
421 prethodni.veza = prethodni.veza.veza;
423 brojElemenata--;
424 return true;
Svarog.pmf.uns.ac.rs/gitweb maintanance Doni Pracner