/ Published in: C++
Lista sa pointerima, ali sa provjerom formata datuma pri unosu i ispisom posle deklariranog datuma u zadatku, 23.09.2012
Expand |
Embed | Plain Text
#include <iostream> #include <string> using namespace std; static struct zivine { string datum; int sifra; float cijena; string naziv, tip; zivine *next; }; zivine * root = new zivine; int sifra = 100; int counter = 0; static string napraviDatum() { string datum; long dan = 0, mjesec = 0, godina = 0; errno = 0; datum = ""; char *end; cout<<"Upisi datum: "<<endl; cin>>datum; if (datum.length() == 10) { dan = strtol(datum.substr(0, 2).c_str(), &end, 10); if ((errno == ERANGE && dan == LONG_MAX) || dan > INT_MAX || dan < INT_MIN) { cout<<"To nije datum, upisi u formatu: DD.MM.YYYY"<<endl; return ""; } else { mjesec = strtol(datum.substr(3, 2).c_str(), &end, 10); if ((errno == ERANGE && dan == LONG_MAX) || mjesec > INT_MAX || dan < INT_MIN) { cout<<"To nije datum, upisi u formatu: DD.MM.YYYY"<<endl; return ""; } else { godina = strtol(datum.substr(6, 4).c_str(), &end, 10); if ((errno == ERANGE && dan == LONG_MAX) || godina > INT_MAX || dan < INT_MIN) { cout<<"To nije datum, upisi u formatu: DD.MM.YYYY"<<endl; return ""; } else { return datum; } } } } else { cout<<"Nije datum. Mjesec napisi sa dvije znamenke, npr: \"09\" a ne \"9\""<<endl; return ""; } } static zivine createNew() { zivine unos; cout<<"Upisi tip: "<<endl; cin>>unos.tip; cout<<"Upisi naziv: "<<endl; cin>>unos.naziv; cout<<"Upisi cijenu: "<<endl; cin>>unos.cijena; unos.sifra = sifra; sifra++; unos.datum = napraviDatum(); unos.next = NULL; return unos; } static zivine createNew(zivine * temp) { zivine unos; cout<<"Upisi tip: "<<endl; cin>>unos.tip; cout<<"Upisi naziv: "<<endl; cin>>unos.naziv; cout<<"Upisi cijenu: "<<endl; cin>>unos.cijena; unos.sifra = sifra; sifra++; unos.datum = napraviDatum(); unos.next = temp; return unos; } static int Add() { zivine * novi = new zivine; *novi = createNew(); if (novi->datum != "") { if (counter==0) { root->next = novi; } else { zivine * temp = root->next; while (temp->next != NULL) temp=temp->next; temp->next = novi; } counter++; return 1; } else return 0; } static void Ispis() { if (counter != 0) { cout<<endl; cout<<"Ispis: "<<endl; cout<<"1 - silazno"<<endl; cout<<"2 - uzlazno"<<endl; cout<<"3 - Datum, kasnije od 23.09.2012"<<endl; int izbor; cin>>izbor; switch (izbor) { case 1: { zivine * temp = root->next; while (temp != NULL) { cout<<endl; cout<<"Tip: "<<temp->tip<<endl; cout<<"Naziv: "<<temp->naziv<<endl; cout<<"Cijena: "<<temp->cijena<<endl; cout<<"Datum: "<<temp->datum<<endl; cout<<"Sifra: "<<temp->sifra<<endl; temp=temp->next; } cout<<"Ukupno "<<counter<<" unos(a)"<<endl; }; break; case 2: { for (int i = counter; i > 0; i--) { zivine * temp = root; for (int j = 0; j < i; j++) { temp=temp->next; } cout<<endl; cout<<"Tip: "<<temp->tip<<endl; cout<<"Naziv: "<<temp->naziv<<endl; cout<<"Cijena: "<<temp->cijena<<endl; cout<<"Datum: "<<temp->datum<<endl; cout<<"Sifra: "<<temp->sifra<<endl; } }; break; case 3: { zivine * temp = root; char *end; for (int i = 0; i < counter; i++) { temp=temp->next;if (long godina = strtol(temp->datum.substr(6, 4).c_str(), &end, 10) >= 2012) { if (long mjesec = strtol(temp->datum.substr(3, 2).c_str(), &end, 10) >= 9 || godina > 2012) { if (long dan = strtol(temp->datum.substr(0, 2).c_str(), &end, 10) >= 23 || mjesec > 9 || godina > 2012) { cout<<endl; cout<<"Tip: "<<temp->tip<<endl; cout<<"Naziv: "<<temp->naziv<<endl; cout<<"Cijena: "<<temp->cijena<<endl; cout<<"Datum: "<<temp->datum<<endl; cout<<"Sifra: "<<temp->sifra<<endl; } } } } };break; default: cout<<"Krivi odabir..."<<endl; } } else cout<<"Nema nis' u listi!"<<endl; } static void Insert() { int pozicija; cout<<"Na koju poziciju? 1-"<<counter<<endl; cin>>pozicija; if (pozicija >= 0) { if (pozicija <= counter) { zivine * temp = root->next; if (pozicija == 1) { zivine * selected = temp; zivine * newNode = new zivine; *newNode = createNew(selected); root->next = newNode; } else { for (int i = 1; i < pozicija - 1; i++) { temp = temp->next; } zivine * previous = temp; zivine * selected = temp->next; zivine * newNode = new zivine; *newNode = createNew(selected); previous->next = newNode; } counter++; } else cout<<"Pozicija nemre biti veca od ukupnog broja elemenata liste!"<<endl; } else cout<<"A da, sad."<<endl; } static void Delete() { int pozicija; cout<<"Na koju poziciju? 1-"<<counter<<endl; cin>>pozicija; if (pozicija >= 0) { if (pozicija <= counter) { zivine * temp = root->next; for (int i = 1; i < pozicija - 1; i++) { temp = temp->next; } temp->next = temp->next->next; counter--; } else cout<<"Pozicija nemre biti veca od ukupnog broja elemenata liste!"<<endl; } else cout<<"A da, sad."<<endl; } static void DeleteAll() { root->next = NULL; counter=0; } static void Locate() { cout<<endl; cout<<"Traziti po: "<<endl; cout<<"1 - naziv"<<endl; cout<<"2 - Tip"<<endl; int izbor; cin>>izbor; switch (izbor) { case 1: { string target; cout<<"Trazeni naziv: "; cin>>target; zivine * temp = root; for (int i = 0; i < counter; i++) { temp=temp->next; if ( temp->naziv == target) { cout<<endl; cout<<"Tip: "<<temp->tip<<endl; cout<<"Naziv: "<<temp->naziv<<endl; cout<<"Cijena: "<<temp->cijena<<endl; cout<<"Datum: "<<temp->datum<<endl; cout<<"Sifra: "<<temp->sifra<<endl; } } }; break; case 2: { string target; cout<<"Trazeni tip: "; cin>>target; zivine * temp = root; for (int i = 0; i < counter; i++) { temp=temp->next; if ( temp->tip == target) { cout<<endl; cout<<"Tip: "<<temp->tip<<endl; cout<<"Naziv: "<<temp->naziv<<endl; cout<<"Cijena: "<<temp->cijena<<endl; cout<<"Datum: "<<temp->datum<<endl; cout<<"Sifra: "<<temp->sifra<<endl; } } }; break; default: cout<<"Nope."<<endl; } } static void DeleteBy() { cout<<endl; cout<<"Brisati po: "<<endl; cout<<"1 - naziv"<<endl; cout<<"2 - Tip"<<endl; int izbor; cin>>izbor; switch (izbor) { case 1: { string target; cout<<"Trazeni naziv: "; cin>>target; zivine * temp = root; for (int i = 0; i < counter; i++) { if ( temp->next->naziv == target) { temp->next = temp->next->next; counter--; } temp=temp->next; } }; break; case 2: { string target; cout<<"Trazeni tip: "; cin>>target; zivine * temp = root; for (int i = 0; i < counter; i++) { if ( temp->next->naziv == target) { temp->next = temp->next->next; counter--; } temp=temp->next; } }; break; default: cout<<"Nope."<<endl; } }
Comments
Subscribe to comments
You need to login to post a comment.

Implementacija funkcije DeleteAll je dosta drugačija nego u mojem kodu pošto ja vršim kompletnu dealokaciju liste, a ovdje se pokazivac samo postavlja na NULL.