/ Published in: C++
Glavna datoteka
primjer operacija nad listom
primjer operacija nad listom
Expand |
Embed | Plain Text
Copy this code and paste it in your HTML
#include <iostream> #include "lista_polje.h" //#include "lista_pok.h" using namespace std; bool Dodaj(Lista*); void IspisListe(Lista*); void Pretrazi_Datum(Lista*); bool BrisanjeUnosa(Lista*); bool BrisanjeVrste(Lista*); void Sortiranje(Lista*); int main() { Lista* L = new Lista; InitL(L); short izb; do { cout << "____________________________________________________________________" << endl; cout << endl << "IZBORNIK" << endl; cout << "____________________________________________________________________" << endl; cout << " 1. Dodavanje zivotinje" << endl; cout << " 2. Ispis liste zivotinja" << endl; cout << " 3. Ispis svih zivotinja dostavljenih nakon 23.rujna 2012." << endl << endl; cout << " 5. Brisati unos prema nazivu zivotinje" << endl; cout << " 6. Brisati sve zivotinje odredjene vrste" << endl; cout << " 7. Sortiranje liste" << endl << endl; cout << " 9. Izlaz iz programa" << endl; cout << "____________________________________________________________________" << endl; cout << "Odabir: "; cin >> izb; switch(izb) { case 1: if(Dodaj(L) ) cout << endl << "Zapis uspjesno dodan u listu." << endl; cout << "____________________________________________________________________" << endl; break; case 2: IspisListe(L); cout << "____________________________________________________________________" << endl; break; case 3: Pretrazi_Datum(L); cout << "____________________________________________________________________" << endl; break; case 5: if(BrisanjeUnosa(L) ) cout << "Unos je uspjesno obrisan." << endl; cout << "____________________________________________________________________" << endl; break; case 6: if(BrisanjeVrste(L) ) cout << "Brisanje uspjesno obavljeno." << endl; cout << "____________________________________________________________________" << endl; break; case 7: Sortiranje(L); cout << "____________________________________________________________________" << endl; break; case 9: break; default: cout << "Pogresan unos." << endl; cout << "____________________________________________________________________" << endl; } cout << endl; } while(izb!=9); delete L; return 0; } bool Dodaj(Lista* L) { cout << "Dodavanje nove zivotinje u listu" << endl << endl; static int sifra = 1; // kreiranje novog zapisa (**sifra - automatski) Zivotinja* nova = new Zivotinja; while(1) { nova->sifra = sifra++; cout << "Sifra(*auto): " << nova->sifra << endl; // unesi podatke cin.ignore(); cout << "Naziv: "; cin.getline(nova->naziv, 50); cout << "Vrsta: "; cin.getline(nova->vrsta, 50); cout << "Cijena: "; cin >> nova->cijena; // unosa datuma while(1) { cout << "Datum dostave (dd mm gggg): "; cin >> nova->dat_dostave.dan >> nova->dat_dostave.mjesec; cin >> nova->dat_dostave.godina; if(nova->dat_dostave.dan>=1 && nova->dat_dostave.dan<=31 && nova->dat_dostave.mjesec>=1 && nova->dat_dostave.mjesec<=12 && nova->dat_dostave.godina>=1000 && nova->dat_dostave.dan<=9999) break; cout << "Pogresan unos. dan(1-31) mjesec(1-12) godina(1000-9999)" << endl; } // potvrda unosa char dn; cout << "Potvrda unosa? (d/n)"; cin >> dn; if(dn=='d' || dn=='D') break; cout << endl << "Ponovni unos" << endl << endl; } // dodavanje zapisa return InsertL(*nova, EndL(L), L); } void IspisListe(Lista* L) { cout << "Ispis liste zivotinja od kraja" << endl << endl; // ispis liste kraj --> pocetak for(Element tren=EndL(L); (tren=PreviousL(tren, L))!=ERROR_CODE; ) cout << RetrieveL(tren, L) << endl; } void Pretrazi_Datum(Lista* L) { Zivotinja z1; int br = 0; // pretrazi listu pocetak..kraj for(Element tren=FirstL(L); tren!=EndL(L); tren=NextL(tren, L) ) { z1 = RetrieveL(tren, L); int dd=(z1.dat_dostave.godina*10000)+(z1.dat_dostave.mjesec*100)+z1.dat_dostave.dan; // ispisi ako je datum dostave > 23.09.2012. if(dd>20120923){ cout << z1 << endl; br++; } } // ispisi broj zivotinja sa datumom > 23.09.2012. cout << "Ukupan broj ispisanih zivotinja: " << br << endl; } bool StrJednako(char* s1, char* s2, int n, int n2) { if(n != n2) return false; for(int i=0; i<n; i++) if(s1[i] != s2[i]) return false; return true; } bool BrisanjeUnosa(Lista* L) { cout << "Brisanje unosa prema nazivu zivotinje" << endl; // unesi naziv char naziv[50]; cin.ignore(); cout << "Naziv: "; cin.getline(naziv, 50); // pretrazi listu $->naziv Zivotinja z1; for(Element tren=FirstL(L); tren!=EndL(L); tren=NextL(tren, L) ) { z1 = RetrieveL(tren, L); // ako je naziv pronadjen if(StrJednako(naziv, z1.naziv, strlen(naziv), strlen(z1.naziv) ) ) { cout << "Zivotinja je pronadjena: " << endl; cout << z1 << endl; // potvrda brisanja char dn; while(1) { cout << endl << "Izbrisati unos? (d/n): "; cin >> dn; // brisanje if(dn=='d' || dn=='D') if(DeleteL(LocateL(z1, L), L) == -1) return 0; else return 1; // ne brisanje if(dn=='n' || dn=='N') return 0; cout << "Pogresan unos." << endl; } } } return 0; } bool BrisanjeVrste(Lista* L) { cout << "Brisanje svih zivotinja odredjene vrste" << endl; // unesi vrstu char vrsta[50]; cin.ignore(); cout << "Vrsta: "; cin.getline(vrsta, 50); // potvrda unosa char dn; while(1) { cout << endl << "Izbrisati sve zivotinje vrste '" << vrsta << "' iz liste? (d/n): "; cin >> dn; if(dn=='d' || dn=='D') break; if(dn=='n' || dn=='N') return 0; cout << "Pogresan unos." << endl; } // pretrazivanje liste $->vrsta int br = 0; Zivotinja z1; for(Element tren=FirstL(L); tren!=EndL(L); ) { z1 = RetrieveL(tren, L); // ako je vrsta pronadjena if(StrJednako(vrsta, z1.vrsta, strlen(vrsta), strlen(z1.vrsta) ) ) // brisanje elementa liste if(DeleteL(LocateL(z1, L), L) ) { br++; continue; } // nastavka pretrazivanja liste tren = NextL(tren, L); } // ispis broja izbrisanih unosa cout << "Broj uspjesno izbrisanih unosa: " << br << endl; if(br) return 1; else return 0; } int BrojElemenata(Lista* L) { int br=0; for(Element tren=FirstL(L); tren!=EndL(L); tren=NextL(tren, L) ) br++; return br; } bool Provjera(Zivotinja z1, Zivotinja z2) { // ako je cijena manja if(z1.cijena<z2.cijena) return true; // ako je cijena ista i naziv veci 0 // ako je cijena ista i naziv manji 1 if(z1.cijena==z2.cijena) { int manji = (strlen(z1.naziv)<strlen(z2.naziv)) ? strlen(z1.naziv) : strlen(z2.naziv); for(int i=0; i<manji; i++) if(z1.naziv[i]>z2.naziv[i]) return false; else if(z1.naziv[i]<z2.naziv[i]) return true; } return false; } void Spoji(Zivotinja p[], int i, int k, int j) { int poc1=i, poc2=k+1, c=0; Zivotinja* p2 = new Zivotinja[j-i+1]; while(poc1<=k && poc2<=j) if(Provjera(p[poc1], p[poc2]) ) p2[c++]=p[poc1++]; else p2[c++]=p[poc2++]; if(poc1>k) while(poc2<=j) p2[c++]=p[poc2++]; else while(poc1<=k) p2[c++]=p[poc1++]; for(int m=i; m<=j; m++) p[m]=p2[m-i]; delete[] p2; } void MerSort(Zivotinja polje[], int i, int j) { if(i<j) { int k = (i+j) / 2; MerSort(polje, i, k); MerSort(polje, k+1, j); Spoji(polje, i, k, j); } } void MerSort(Zivotinja polje[], int n) { MerSort(polje, 0, n-1); } void Sortiranje(Lista* L) { cout << "Sortiranje liste" << endl; int broj_el=BrojElemenata(L), i=0; // slozi novo polje od liste Zivotinja* polje = new Zivotinja[broj_el]; for(Element nova=FirstL(L); nova!=EndL(L); nova=NextL(nova, L) ) polje[i++] = RetrieveL(nova, L); // izbrisi elemente liste DeleteAllL(L); // sortiraj MerSort(polje, broj_el); // napravi listu od polja (obrnuti redoslijed) for(int i=0; i<broj_el; i++) InsertL(polje[i], FirstL(L), L); // izbrisi polje delete[] polje; } // hackerma3x (2012)