gitweb on Svarog

projekti pod git sistemom za održavanje verzija -- projects under the git version control system
liste, primeri operacija, popravke. nepotreban argument metoda, deklaracija promenlji...
[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 int broj;
33 switch (menu) {
34 case 'S':
35 lista.stampajNaEkran();
36 break;
37 case 'U':
38 unosBrojeva();
39 break;
40 case 'D':
41 broj = Svetovid.in.readInt("Broj koji dodajete:");
42 lista.dodajNaPocetak(broj);
43 break;
44 case 'O':
45 broj = Svetovid.in.readInt("Broj koji dodajete:");
46 int pos = Svetovid.in.readInt("Pozicija na koju dodajete:");
47 lista.dodaj(broj, pos);
48 break;
49 case 'I':
50 izbacivanjeEl();
51 break;
52 case 'V':
53 izbacivanjeElSvi();
54 break;
55 case 'E':
56 izbacivanjeK();
57 break;
58 case 'K':
59 stampajK();
60 break;
61 case 'M':
62 Svetovid.out.println("Minimum liste je:" + lista.minimum());
63 break;
64 case 'P':
65 pretraga();
66 break;
67 default:
68 break;
69 }
70 if (menu != 'Q') {
71 Svetovid.out.println(" -- enter za povratak u meni --");
72 Svetovid.in.readLine();
73 }
74 }
75 }
77 static void unosBrojeva() {
78 System.out.println("unesite n (broj brojeva): ");
79 int n = Svetovid.in.readInt();
80 System.out.println("unesite brojeve");
81 for (int i = 0; i < n; i++) {
82 int br = Svetovid.in.readInt();
83 lista.dodajNaPocetak(br);
84 }
85 }
87 static void pretraga() {
88 int broj = Svetovid.in.readInt("Unesite broj koji trazite:");
89 if (lista.uListi(broj)) {
90 Svetovid.out.println("Broj postoji u listi");
91 } else {
92 Svetovid.out.println("Broj ne postoji u listi");
93 }
94 }
96 static void stampajK() {
97 int broj = Svetovid.in
98 .readInt("Unesite redni broj elementa koji zelite:");
99 try {
100 Svetovid.out.println("Element na mestu " + broj + " je "
101 + lista.element(broj));
102 } catch (Exception e) {
103 Svetovid.out.println("Greska: " + e.getMessage());
108 static void izbacivanjeK() {
109 int broj = Svetovid.in.readInt("Unesite poziciju koju treba izbaciti:");
110 if (lista.izbaciK(broj)) {
111 Svetovid.out.println("Pozicija je izbacena iz liste");
112 } else {
113 Svetovid.out.println("Pozicija ne postoji u listi");
117 static void izbacivanjeElSvi() {
118 int broj = Svetovid.in.readInt("Unesite broj koji treba izbaciti:");
120 Svetovid.out.println("Izbaceno je " + lista.izbaciIzListeSve(broj)
121 + "brojeva");
125 static void izbacivanjeEl() {
126 int broj = Svetovid.in.readInt("Unesite broj koji treba izbaciti:");
127 if (lista.izbaciIzListe(broj)) {
128 Svetovid.out.println("Broj je izbacen iz liste");
129 } else {
130 Svetovid.out.println("Broj ne postoji u listi");
136 /**
137 * Povezana lista brojeva sa operacijama nad njom i brojace elemenata. Lista u
138 * svakom momentu moze da efikasno vrati broj elemenata u njoj.
139 */
140 class ListaBrojevaBr {
141 class Element {
142 int info;
143 Element veza;
145 public Element(int br) {
146 this.info = br;
147 this.veza = null;
150 public String toString() {
151 return info + "";
155 // pokazivac na prvi element liste
156 Element prvi;
158 // interni brojac koji pomaze kod nekih operacija
159 int brojElemenata;
161 /** Kreira praznu listu brojeva. */
162 public ListaBrojevaBr() {
163 this.prvi = null;
164 this.brojElemenata = 0;
167 /** vraca broj elemenata u listi */
168 public int velicina() {
169 return brojElemenata;
172 /** Vraca da li je lista prazna */
173 public boolean jePrazna() {
174 return prvi == null;
177 public void dodajNaPocetak(int br) {
178 Element novi = new Element(br);
179 novi.veza = prvi;
180 prvi = novi;
181 brojElemenata++;
184 public void stampajNaEkran() {
185 if (prvi == null) {
186 Svetovid.out.println("Lista je prazna");
187 } else {
188 Svetovid.out.println("Sadrzaj liste duzine:"+velicina());
189 Element tekuci = prvi;
190 while (tekuci != null) {
191 System.out.println(tekuci.info);
192 tekuci = tekuci.veza;
194 System.out.println();
198 public String toString() {
199 String rez = "Lista: [ ";
200 Element tekuci = prvi;
201 while (tekuci != null) {
202 rez += tekuci.info + " ";
203 tekuci = tekuci.veza;
205 rez += "]";
206 return rez;
209 /**
210 * Vraca vrednost k-tog elementa. Prvi element liste je na mestu 0, drugi na
211 * mestu 1 i tako dalje. Ne postoje elementi na negativnim pozicijama. U
212 * slucaju nepostojeceg indeksa baca IndexOutOfBounds izuzetak.
213 *
214 * @throws IndexOutOfBoundsException
215 */
216 public int element(int k) {
217 if (k < 0) {
218 throw new IndexOutOfBoundsException(
219 "Ne postoje elementi na negativnim pozicijama!");
222 if (k < brojElemenata) {
223 Element tekuci = prvi;
224 int br = 0;
225 while (br < k) {
226 tekuci = tekuci.veza;
227 br++;
229 return tekuci.info;
230 } else {
231 throw new IndexOutOfBoundsException("Lista je kraca od "
232 + k);
236 // alternativna verzija procedure koja bi radila ako nemamo brojElemenata
237 // kao polje
238 public int elementB(int k) {
239 if (k < 0) {
240 throw new IndexOutOfBoundsException(
241 "Ne postoje elementi na negativnim pozicijama!");
244 Element tekuci = prvi;
245 int brojac = 0;
247 while (tekuci != null && k > brojac) {
248 tekuci = tekuci.veza;
249 brojac++;
252 if (tekuci != null) {
253 return tekuci.info;
254 } else {
255 throw new IndexOutOfBoundsException("Lista je kraca od "
256 + k);
260 /** Vraca minimum liste. U slucaju prazne liste vratice maksimalni Integer. */
261 public int minimum() {
262 int min = Integer.MAX_VALUE;
264 Element tekuci = prvi;
265 while (tekuci != null) {
266 if (tekuci.info < min) {
267 min = tekuci.info;
269 tekuci = tekuci.veza;
272 return min;
275 /** Vraca da li broj br postoji u listi. */
276 public boolean uListi(int br) {
277 Element tekuci = prvi;
278 while (tekuci != null && tekuci.info != br) {
279 tekuci = tekuci.veza;
282 // ako smo dosli do kraja liste i nismo ga nasli
283 // tekuci ce biti jednako null
284 return tekuci != null;
287 /**
288 * Dodaje broj 'br' na poziciju 'pos'. Ako je pozicija negativna, broj ce
289 * biti dodat na prvo mesto. Ako je pozicija veza od broja elemenata, broj
290 * ce biti dodat na poslednje mesto.
291 *
292 * @param br
293 * broj koji se dodaje u listu
294 * @param pos
295 * pozicija na koju se broj dodaje
296 */
297 public void dodaj(int br, int pos) {
298 Element novi = new Element(br);
300 // proverimo i popravimo pos po potrebi
301 if (pos < 0)
302 pos = 0;
303 if (pos > brojElemenata) {
304 pos = brojElemenata;
307 // dodavanje na pocetak je jednostavno
308 if (pos == 0) {
309 novi.veza = prvi;
310 prvi = novi;
311 brojElemenata++;
312 } else {
313 // inace nam treba prethodni element
314 Element prethodni = prvi;
315 int brojac = 0;
316 while (prethodni != null && brojac < pos - 1) {
317 prethodni = prethodni.veza;
318 brojac++;
320 novi.veza = prethodni.veza;
321 prethodni.veza = novi;
322 brojElemenata++;
326 /**
327 * Izbacuje broj 'br' iz liste, naravno ako postoji i vraca da li je
328 * operacija uspesno obavljena.
329 */
330 public boolean izbaciIzListe(int br) {
331 // proverimo da li je prvi element
332 if (prvi != null && prvi.info == br) {
333 prvi = prvi.veza;
334 brojElemenata--;
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