gitweb on Svarog

projekti pod git sistemom za održavanje verzija -- projects under the git version control system
Novi primer: ListaListi
[spa1-materijali.git] / kodovi / liste / ListaListi.java
1 /*
2 * Primer klase koja u sebi sadrzi jednostruko povezanu listu, a u kojoj
3 * svaki element takodje ima pokazivac na jos po jednu nezavisnu listu. *
4 */
6 /**
7 * Glavni program koji ilustruje koriscenje klase SadrzajOrmana.
8 *
9 */
10 public class ListaListi {
11 public static void main(String[] args) {
12 SadrzajGrupeOrmana so = new SadrzajGrupeOrmana();
14 System.out.println(so);
16 so.dodajOrman("donji 1");
17 so.dodajPosudu("donji 1", "plitki tanjir");
18 so.dodajPosudu("donji 1", "duboki tanjir");
19 so.dodajPosudu("donji 1", "duboki tanjir");
20 so.dodajPosudu("donji 1", "plitki tanjir");
21 so.dodajPosudu("donji 1", "plitki tanjir");
22 so.dodajPosudu("donji 1", "duboki tanjir");
23 so.dodajPosudu("donji 1", "plitki tanjir");
25 so.dodajOrman("donji 1");
27 System.out.println(so);
29 so.dodajPosudu("donji 2", "tiganj za palacinke");
30 so.dodajPosudu("gornji", "casa");
31 so.dodajPosudu("gornji", "casa");
32 so.dodajPosudu("gornji", "solja");
33 so.dodajPosudu("gornji", "slanik");
35 System.out.println(so);
37 System.out.println("Ukloni 'plitki tanjir':"
38 + so.ukloniPosudu("plitki tanjir"));
39 System.out.println(so);
41 System.out.println("Ukloni 'tiganj za palacinke':"
42 + so.ukloniPosudu("tiganj za palacinke"));
43 System.out.println(so);
45 System.out.println("Opet ukloni 'tiganj za palacinke':"
46 + so.ukloniPosudu("tiganj za palacinke"));
47 System.out.println(so);
48 }
49 }
51 /**
52 * Klasa koja predstavlja sadrzaj jedne grupe ormana. Za svaki orman se pamti
53 * njegov naziv i spisak posuda koje su u njemu. Svi ormani se moraju zvati
54 * razlicito. Posude su predstavljene svojim nazivima.
55 *
56 *
57 */
58 class SadrzajGrupeOrmana {
60 // pokazivac na prvi orman u listi
61 private Orman prviOrman;
63 /**
64 * Klasa koja predstavlja pojedinacni orman.
65 *
66 */
67 class Orman {
68 String naziv;
69 Orman veza;
70 Posuda sadrzaj;
72 public Orman(String naziv) {
73 this.naziv = naziv;
74 this.veza = null;
75 }
77 public String toString() {
78 String rez = "[" + naziv + ":";
79 Posuda tek = sadrzaj;
80 if (tek != null) {
81 rez += " " + tek;
82 tek = tek.veza;
83 while (tek != null) {
84 rez += ", " + tek;
85 tek = tek.veza;
86 }
87 }
88 rez += " ]";
89 return rez;
90 }
91 }
93 /**
94 * Klasa predstavlja jednu posudu.
95 */
96 class Posuda {
97 String naziv;
98 Posuda veza;
100 public Posuda(String posuda) {
101 this.naziv = posuda;
102 this.veza = null;
105 public String toString() {
106 return naziv;
110 public String toString() {
111 String rez = "Ormani:";
112 Orman tek = prviOrman;
113 while (tek != null) {
114 rez += " " + tek;
115 tek = tek.veza;
117 return rez;
120 /**
121 * Dodaje novi orman u listu ormana, ako vec ne postoji
122 */
123 public void dodajOrman(String noviNaziv) {
124 // dodajemo samo ako ne postoji
125 if (!postojiOrman(noviNaziv)) {
126 Orman novi = new Orman(noviNaziv);
127 novi.veza = prviOrman;
128 prviOrman = novi;
132 /**
133 * Vraca da li trazeni orman vec postoji
134 */
135 public boolean postojiOrman(String trazeni) {
136 Orman tekuci = prviOrman;
137 while (tekuci != null) {
138 if (tekuci.naziv.equals(trazeni)) {
139 return true;
141 tekuci = tekuci.veza;
143 return false;
144 // alternativno
145 // return nadjiOrman(trazeni) != null;
148 // interni metod koji vraca pokazivac na odg. orman
149 private Orman nadjiOrman(String orman) {
150 Orman tekuci = prviOrman;
151 while (tekuci != null) {
152 if (tekuci.naziv.equals(orman)) {
153 return tekuci;
155 tekuci = tekuci.veza;
157 return null;
160 /**
161 * Dodaje posudu u orman. Ako orman nije postojao, bice dodat.
162 */
163 public void dodajPosudu(String orman, String posuda) {
164 Orman cilj = nadjiOrman(orman);
165 if (cilj == null) {
166 dodajOrman(orman);
167 cilj = nadjiOrman(orman);
169 // moze biti vise istih posuda
170 // ne proveravamo nista
171 Posuda nova = new Posuda(posuda);
172 nova.veza = cilj.sadrzaj;
173 cilj.sadrzaj = nova;
176 /**
177 * Vraca da li se posuda sa datim nazivom nalazi u ormanu sa datim imenom.
178 */
179 public boolean postojiPosudaUOrmanu(String orman, String posuda) {
180 Orman o = nadjiOrman(orman);
181 return postojiPosudaUOrmanu(o, posuda);
184 // interni metod koji u sustini resava problem
185 private boolean postojiPosudaUOrmanu(Orman or, String posuda) {
186 if (or != null) {
187 Posuda trenutna = or.sadrzaj;
188 while (trenutna != null && !trenutna.naziv.equals(posuda)) {
189 trenutna = trenutna.veza;
191 return trenutna != null;
193 return false;
196 /**
197 * Vraca orman u kome se nalazi trazena posuda. Ako ima vise ovakvih ormana
198 * vratice se prvi u kome je nadjena trazena posuda. Ako nema ovakve posude
199 * ni u jednom ormanu, metod vraca `null`.
200 */
201 public String nadjiOrmanSaPosudom(String posuda) {
202 Orman trenutni = prviOrman;
203 while (trenutni != null) {
204 if (postojiPosudaUOrmanu(trenutni, posuda)) {
205 return trenutni.naziv;
207 trenutni = trenutni.veza;
209 return null;
212 /**
213 * Uklanja posudu iz datog ormana. Ako orman ostane prazan, uklanja i orman.
214 */
215 public boolean ukloniPosudu(String orman, String posuda) {
216 Orman cilj = nadjiOrman(orman);
218 return ukloniPosudu(cilj, posuda);
221 // interni metod koji prima pokazivac na unutrasnju strukturu
222 private boolean ukloniPosudu(Orman ormanpok, String posuda) {
223 boolean nadjena = false;
224 if (ormanpok != null) {
225 // da li je prva?
226 if (ormanpok.sadrzaj != null
227 && ormanpok.sadrzaj.naziv.equals(posuda)) {
228 ormanpok.sadrzaj = ormanpok.sadrzaj.veza;
229 nadjena = true;
230 } else {
231 // nije prva
232 Posuda preth = ormanpok.sadrzaj;
233 while (preth.veza != null && !preth.veza.naziv.equals(posuda)) {
234 preth = preth.veza;
236 if (preth.veza != null) {
237 preth.veza = preth.veza.veza;
238 nadjena = true;
242 if (nadjena) {
243 // ako je bilo promene proveriti i orman
244 if (ormanpok.sadrzaj == null) {
245 ukloniOrman(ormanpok.naziv);
248 return nadjena;
251 /**
252 * Uklanja posudu sa datim nazivom iz bilo kog ormana
253 */
254 public boolean ukloniPosudu(String posuda) {
255 Orman tekuci = prviOrman;
256 // pokusavamo da uklonimo iz svakog ormana
257 // prekidamo ako uspemo
258 while (tekuci != null && !ukloniPosudu(tekuci, posuda)) {
259 tekuci = tekuci.veza;
261 // ako smo prosli celu listu -> nismo uklonili nista
262 return tekuci != null;
265 /**
266 * Pokusava da uklani orman sa datim nazivom i vraca da
267 * li je uspesno uklonjen.
268 */
269 public boolean ukloniOrman(String naziv) {
270 // provera da li uopste ima ormana
271 if (prviOrman == null) {
272 return false;
274 // proverimo da li je prvi
275 if (prviOrman.naziv.equals(naziv)) {
276 prviOrman = prviOrman.veza;
277 return true;
279 // trazimo u ostatku
280 Orman prethodni = prviOrman;
281 while (prethodni.veza != null) {
282 if (prethodni.veza.naziv.equals(naziv)) {
283 prethodni.veza = prethodni.veza.veza;
284 return true;
286 prethodni = prethodni.veza;
288 return false;
Svarog.pmf.uns.ac.rs/gitweb maintanance Doni Pracner