Revision: 60477
Initial Code
Initial URL
Initial Description
Initial Title
Initial Tags
Initial Language
at November 10, 2012 07:45 by PetraKuhar
Initial Code
#include <iostream> #include <string> using namespace std; // #include "lista_polje.h" #include "lista_pokazivac.h" int dodaj(int sifra, Lista *zivotinje){ zivotinja nova; nova.sifra = sifra; cout << "Unesi naziv zivotinje: "; cin >> nova.naziv; cout << "Unesi vrstu: "; cin >> nova.vrsta; cout << "Unesi cijenu: "; cin >> nova.cijena; cout << "Unesi datum: "; cin >> nova.datum; // buduci da InsertL vraca 0 ili 1, mi to samo proslijedimo // tamo odakle je pozvan dodaj() return InsertL(nova, EndL(zivotinje), zivotinje); } void ispis(Lista *zivotinje) { element temp; zivotinja tmp; cout << endl; cout << "sifra\t naziv\t vrsta \t cijena \t datum" << endl; cout << "_________________________________________________________________" << endl; temp = EndL(zivotinje); do { temp = PreviousL(temp, zivotinje); tmp = RetrieveL(temp, zivotinje); cout << tmp.sifra << "\t" << tmp.naziv << "\t" << tmp.vrsta << "\t" << tmp.cijena << "\t" << tmp.datum << endl; } while (temp != FirstL(zivotinje)); } void pretrazi(Lista *zivotinje) { cout << endl; cout << "Pretrazujemo listu za novijim zivotinjama." << endl; element temp; zivotinja tmp; temp = FirstL(zivotinje); do { tmp = RetrieveL(temp, zivotinje); if (tmp.datum > 20120923) { cout << "Naziv: " << tmp.naziv << ", datum: "; cout << tmp.datum << endl; } temp = NextL(temp, zivotinje); } while(temp != EndL(zivotinje)); } int brisi_naziv(string naziv, Lista *zivotinje) { element temp, prethodni; zivotinja tmp; int brisanje = 0; temp = FirstL(zivotinje); do { tmp = RetrieveL(temp, zivotinje); if (tmp.naziv == naziv) { prethodni = PreviousL(temp, zivotinje); DeleteL(temp, zivotinje); brisanje = 1; temp = prethodni; } temp = NextL(temp, zivotinje); } while(temp != EndL(zivotinje)); return brisanje; } int brisi_vrsta(string vrsta, Lista *zivotinje) { element temp, prethodni; zivotinja tmp; int brisanje = 0; temp = FirstL(zivotinje); do { tmp = RetrieveL(temp, zivotinje); if (tmp.vrsta == vrsta) { prethodni = PreviousL(temp, zivotinje); DeleteL(temp, zivotinje); brisanje = 1; temp = prethodni; } temp = NextL(temp, zivotinje); } while(temp != EndL(zivotinje)); return brisanje; } void merge_2(zivotinja polje[], int lijevi, int desni) { int sredina = (lijevi + desni) / 2; zivotinja temp; if (desni - lijevi == 1) { // polje od 2 elem if (polje[desni].cijena > polje[lijevi].cijena) { temp = polje[desni]; polje[desni] = polje[lijevi]; polje[lijevi] = temp; return; } } else if (desni == lijevi) { // polje od 1 el return; } else { // rekurzija merge_2(polje, lijevi, sredina); merge_2(polje, sredina +1, desni); // spajanje dijelova int size_pomocno = desni-lijevi +1; zivotinja *polje_pomocno = new zivotinja[size_pomocno]; int l = lijevi; int s = sredina +1; for (int i = 0; i < size_pomocno; i++) { if (l == sredina+1) { // sad samo s vadi polje_pomocno[i] = polje[s]; s++; continue; } if (s == desni +1) { // samo l vadi) polje_pomocno[i] = polje[l]; l++; continue; } if (polje[l].cijena > polje[s].cijena) { polje_pomocno[i] = polje[l]; l++; } else { polje_pomocno[i] = polje[s]; s++; } } // iz pomocnog iskopiraj u glavno, obrisi pomocno int j = 0; for (int i = lijevi; i <= desni; i++) { polje[i] = polje_pomocno[j]; j++; } // delete polje_pomocno; // kvar! } } void merge_1(zivotinja polje[], int lijevi, int desni) { int sredina = (lijevi + desni) / 2; zivotinja temp; if (desni - lijevi == 1) { // polje od 2 elem if (polje[desni].naziv > polje[lijevi].naziv) { temp = polje[desni]; polje[desni] = polje[lijevi]; polje[lijevi] = temp; return; } } else if (desni == lijevi) { // polje od 1 el return; } else { // rekurzija merge_1(polje, lijevi, sredina); merge_1(polje, sredina +1, desni); // spajanje dijelova int size_pomocno = desni-lijevi +1; zivotinja *polje_pomocno = new zivotinja[size_pomocno]; int l = lijevi; int s = sredina +1; for (int i = 0; i < size_pomocno; i++) { if (l == sredina+1) { // sad samo s vadi polje_pomocno[i] = polje[s]; s++; continue; } if (s == desni +1) { // samo l vadi) polje_pomocno[i] = polje[l]; l++; continue; } if (polje[l].naziv > polje[s].naziv) { polje_pomocno[i] = polje[l]; l++; } else { polje_pomocno[i] = polje[s]; s++; } } // iz pomocnog iskopiraj u glavno, obrisi pomocno int j = 0; for (int i = lijevi; i <= desni; i++) { polje[i] = polje_pomocno[j]; j++; } } } int main() { zivotinja prva, druga, treca, cetvrta, peta; prva.cijena = 100; prva.sifra = 1; prva.naziv = "Newfoundler"; prva.vrsta = "pas"; prva.datum = 20121010; // YYYYMMDD Lista zivotinje; InitL(&zivotinje); InsertL(prva, EndL(&zivotinje), &zivotinje); druga.cijena = 5000000; druga.sifra = 2; druga.naziv = "Lav"; druga.vrsta = "divlja macka"; druga.datum = 20100505; InsertL(druga, EndL(&zivotinje), &zivotinje); treca.cijena = 50000; treca.sifra = 3; treca.naziv = "Pangolin"; treca.vrsta = "mravojed"; treca.datum = 20121105; InsertL(treca, EndL(&zivotinje), &zivotinje); cetvrta.cijena = 123; cetvrta.sifra = 4; cetvrta.naziv = "Russian blue"; cetvrta.vrsta = "macka"; cetvrta.datum = 20121511; InsertL(cetvrta, EndL(&zivotinje), &zivotinje); peta.cijena = 21; peta.sifra = 5; peta.naziv = "Tigar"; peta.vrsta = "divlja macka"; peta.datum = 20110105; InsertL(peta, EndL(&zivotinje), &zivotinje); int sifra = 6; int rezultat = dodaj(sifra, &zivotinje); if (rezultat == 1) { cout << "Zivotinja uspjesno dodana." << endl; sifra++; } else { cout << "Neuspjelo dodavanje." << endl; } // druga funkcija: ispis liste unatrag ispis(&zivotinje); // treca funkcija: pretrazivanje za datumom > 23.09.2012. pretrazi(&zivotinje); // cetvrta funkcija: brisanje po nazivu cout << endl; cout << "Naziv zivotinje koju zelite obrisati: "; string naziv; cin >> naziv; if (brisi_naziv(naziv, &zivotinje) == 0) { cout << "Brisanje nije uspjelo (nepostojeca zivotinja?)" << endl << endl; } // ispisemo listu da vidimo radi li brisanje ispis(&zivotinje); cout << endl; // peta funkcija: brisanje po vrsti cout << endl; cout << "Vrstu zivotinje koju zelite obrisati: "; string vrsta; cin >> vrsta; if (brisi_vrsta(vrsta, &zivotinje) == 0) { cout << "Brisanje nije uspjelo (nepostojeca zivotinja?)" << endl << endl; } // ispisemo listu da vidimo radi li brisanje ispis(&zivotinje); cout << endl; // sortiranje // prvo ucitamo cijelu listu u jedno polje. // da bismo to mogli, moramo prebrojati koliko je el. u listi. element temp; zivotinja tmp; temp = FirstL(&zivotinje); int broj = 0; while (temp != EndL(&zivotinje)) { temp = NextL(temp, &zivotinje); ++broj; } // stvorimo polje! zivotinja *polje_zivotinje = new zivotinja[broj]; // citamo iz liste, spremamo u polje temp = FirstL(&zivotinje); for (int i = 0; i < broj; ++i) { tmp = RetrieveL(temp, &zivotinje); temp = NextL(temp, &zivotinje); polje_zivotinje[i] = tmp; } // sad mozemo sortirati polje! merge_1(polje_zivotinje, 0, broj-1); // sort po nazivu cout << endl; cout << endl << "Ispisujemo sortirani sadrzaj liste (po nazivu)." << endl; for (int i = 0; i < broj; i++) { cout << polje_zivotinje[i].naziv << endl; } merge_2(polje_zivotinje, 0, broj-1); // po cijeni cout << endl; cout << endl << "Ispisujemo sortirani sadrzaj liste (po cijeni)." << endl; for (int i = 0; i < broj; i++) { cout << polje_zivotinje[i].naziv << " " << polje_zivotinje[i].cijena << endl; } system("pause"); return 0; }
Initial URL
main_petrak
Initial Description
Glavni kod zadatka 1 sa komentarima
Initial Title
Zadatak 1 za kolegij Strukture podataka
Initial Tags
Initial Language
C++