Posted By

msestak2 on 11/10/12


Tagged

list mergesort deletel initl endl locatel retrievel


Versions (?)

Implementacija liste - main.cpp


 / Published in: C++
 

Ovo je glavna datoteka main u kojoj se pozivaju funkcije iz biblioteka listapolje.h i listapokazivaci.h za implementaciju liste. Korisnik može odabrati sljedeće opcije: unos nove životinje, ispis životinja prema silaznoj šifri, filtriranje prema datumu i ispis životinja dostavljenih nakon 23.09.2012., brisanje prema unesenom nazivu ili vrsti životinje te silazno sortiranje prema nazivu i cijenu korištenjem metode Merge Sort (prije je potrebno elemente liste prebaciti u polje, pa se zatim to polje sortira).

  1. #include<iostream>
  2. #include<string>
  3.  
  4. using namespace std;
  5.  
  6. #define POCETAK 1
  7.  
  8. //#include "lista_pokazivaci.h"
  9. #include "lista_polje.h"
  10.  
  11. bool isEmpty( list* L){
  12. return FirstL(L) == EndL(L);
  13. }
  14.  
  15. int unos(list *L){
  16. int sifra = 0;
  17. if(isEmpty(L))
  18. sifra = POCETAK;
  19. else{
  20. sifra = RetrieveL(PreviousL(EndL(L),L),L).sifra+1;
  21. }
  22. elementtype novo;
  23. cout <<"Nova zivotinja #" << sifra << endl;
  24. novo.sifra = sifra;
  25. cout << "Naziv: "; cin.ignore(); cin.getline(novo.naziv, 29, '\n');
  26. cout << "Vrsta: "; cin.getline(novo.vrsta, 29, '\n');
  27. cout << "Cijena: "; cin >> novo.cijena;
  28. if(novo.cijena < 0)
  29. return 0;
  30. cout << "Datum dostave" << endl;
  31. cout << "Dan: "; cin >> novo.datum_dostave.dan;
  32. if(novo.datum_dostave.dan<1 || novo.datum_dostave.dan>31)
  33. return 0;
  34. cout << "Mjesec: "; cin >> novo.datum_dostave.mjesec;
  35. if(novo.datum_dostave.mjesec<1 || novo.datum_dostave.mjesec>12)
  36. return 0;
  37. cout << "Godina: "; cin >> novo.datum_dostave.godina;
  38. if(novo.datum_dostave.godina<1900)
  39. return 0;
  40. InsertL(novo,EndL(L),L);
  41. return 1;
  42. }
  43.  
  44. void ispis(list *L){
  45. element zadnji = EndL(L);
  46. while(zadnji != FirstL(L)){
  47.  
  48. elementtype ziv = RetrieveL(PreviousL(zadnji,L),L);
  49. cout << "Sifra: " << ziv.sifra << endl;
  50. cout << "Naziv: " << ziv.naziv << endl;
  51. cout << "Vrsta: " << ziv.vrsta << endl;
  52. cout << "Cijena: " << ziv.cijena << endl;
  53. cout << "Datum dostave: " << ziv.datum_dostave.dan<<"."
  54. <<ziv.datum_dostave.mjesec << "."
  55. <<ziv.datum_dostave.godina<<"."<<endl;
  56. cout <<endl;
  57. zadnji = PreviousL(zadnji,L);
  58. }
  59. }
  60.  
  61. void filterDostava(int dan, int mjesec, int godina, list* L){
  62.  
  63. if(isEmpty(L)){
  64. cout << endl << "Broj pronadjenih zivotinja: 0" << endl;
  65. return;
  66. }
  67.  
  68. int broj = 0;
  69. element tekuci = FirstL(L);
  70.  
  71. struct{
  72. int dan,mjesec,godina;
  73. }dostava;
  74.  
  75. while(tekuci != EndL(L)){
  76. elementtype ziv = RetrieveL(tekuci,L);
  77. dostava.dan = ziv.datum_dostave.dan;
  78. dostava.mjesec = ziv.datum_dostave.mjesec;
  79. dostava.godina = ziv.datum_dostave.godina;
  80.  
  81. if((dostava.godina>godina) ||
  82. ((dostava.godina==godina)&&(dostava.mjesec>mjesec)) ||
  83. ((dostava.godina==godina)&&(dostava.mjesec==mjesec)) && (dostava.dan>dan)){
  84. broj++;
  85. cout << "Sifra: " << ziv.sifra << endl;
  86. cout << "Naziv: " << ziv.naziv << endl;
  87. cout << "Vrsta: " << ziv.vrsta << endl;
  88. cout << "Cijena: " << ziv.cijena << endl;
  89. cout << "Datum dostave: " << ziv.datum_dostave.dan<<"."
  90. <<ziv.datum_dostave.mjesec << "."
  91. <<ziv.datum_dostave.godina<<"."<<endl;
  92. cout << endl;
  93. }
  94. tekuci = NextL(tekuci,L);
  95. }
  96. cout << endl << "Broj pronadjenih zivotinja: " << broj << endl;
  97. }
  98.  
  99. int brisiPremaNazivu(list* L){
  100. char naziv[30];
  101.  
  102. cin.ignore();
  103. cout << "Unesite naziv zivotinje za brisanje: "; cin.getline(naziv, 29, '\n');
  104.  
  105. if(isEmpty(L))
  106. return 0;
  107.  
  108. element tekuci = FirstL(L);
  109. bool postoji = false;
  110. while(tekuci != EndL(L)){
  111. elementtype ziv = RetrieveL(tekuci,L);
  112. if(strcmp(ziv.naziv,naziv)==0){
  113. postoji = true;
  114. break;
  115. }
  116. tekuci = NextL(tekuci,L);
  117. }
  118.  
  119. if(postoji){
  120. DeleteL(tekuci,L);
  121. }
  122. else
  123. return 0;
  124.  
  125. return 1;
  126. }
  127.  
  128. int brisiPremaVrsti(list* L){
  129. char vrsta[30];
  130. cin.ignore();
  131. cout << "Unesite vrstu zivotinja za brisanje: "; cin.getline(vrsta, 29, '\n');
  132.  
  133. element tekuci = FirstL(L);
  134. bool postoji = false;
  135. while(tekuci != EndL(L)){
  136. elementtype ziv = RetrieveL(tekuci,L);
  137. if(strcmp(ziv.vrsta,vrsta)==0){
  138. postoji = true;
  139. DeleteL(tekuci,L);
  140. }
  141. tekuci = NextL(tekuci,L);
  142. }
  143. if(!postoji)
  144. return 0;
  145. return 1;
  146. }
  147.  
  148. void spoji(elementtype *polje,int donji,int sredina,int gornji)
  149. {
  150. int h,i,j,k;
  151. h=donji;
  152. i=donji;
  153. j=sredina+1;
  154.  
  155. elementtype *temp = new elementtype[gornji-donji+1];
  156.  
  157. while((h<=sredina)&&(j<=gornji))
  158. {
  159. if(polje[h].cijena>polje[j].cijena || ((polje[h].cijena==polje[j].cijena)&&(strcmp(polje[h].naziv, polje[j].naziv)>0)))
  160. {
  161. temp[i]=polje[h];
  162. h++;
  163. }
  164. else
  165. {
  166. temp[i]=polje[j];
  167. j++;
  168. }
  169. i++;
  170. }
  171. if(h>sredina)
  172. {
  173. for(k=j; k<=gornji; k++)
  174. {
  175. temp[i]=polje[k];
  176. i++;
  177. }
  178. }
  179. else
  180. {
  181. for(k=h; k<=sredina; k++)
  182. {
  183. temp[i]=polje[k];
  184. i++;
  185. }
  186. }
  187. for(k=donji; k<=gornji; k++) polje[k]=temp[k];
  188. delete [] temp;
  189. }
  190.  
  191. void mergesort(elementtype *polje, int donji,int gornji )
  192. {
  193. int sredina;
  194. if(donji<gornji)
  195. {
  196. sredina=(donji+gornji)/2;
  197. mergesort(polje,donji,sredina);
  198. mergesort(polje,sredina+1,gornji);
  199. spoji(polje,donji,sredina,gornji);
  200. }
  201. }
  202.  
  203.  
  204. void SortirajCijenaNaziv(list *L){
  205. int broj=0;
  206. element tekuci = FirstL(L);
  207. while(tekuci != EndL(L)){
  208. broj++;
  209. tekuci = NextL(tekuci,L);
  210. }
  211.  
  212. elementtype* polje = new elementtype[broj];
  213.  
  214. tekuci = FirstL(L);
  215. int i = 0;
  216. while(tekuci != EndL(L)){
  217. polje[i] = RetrieveL(tekuci,L);
  218. tekuci = NextL(tekuci,L);
  219. i++;
  220. }
  221.  
  222. mergesort(polje,0,broj-1);
  223.  
  224. DeleteAllL(L);
  225.  
  226. L=NULL;
  227.  
  228. L = InitL(L);
  229.  
  230. cout << "SORTIRANO SILAZNO PREMA CIJENI I NAZIVU" << endl;
  231. for( i = 0; i < broj; i++){
  232. InsertL(polje[i],EndL(L),L);
  233. elementtype ziv = polje[i];
  234. cout << "Sifra: " << ziv.sifra << endl;
  235. cout << "Naziv: " << ziv.naziv << endl;
  236. cout << "Vrsta: " << ziv.vrsta << endl;
  237. cout << "Cijena: " << ziv.cijena << endl;
  238. cout << "Datum dostave: " << ziv.datum_dostave.dan<<"."
  239. <<ziv.datum_dostave.mjesec << "."
  240. <<ziv.datum_dostave.godina<<"."<<endl;
  241. cout <<endl;
  242. }
  243. }
  244.  
  245. int main(){
  246.  
  247. list* L = NULL;
  248.  
  249. L = InitL(L);
  250.  
  251. int odabir = 0;
  252.  
  253. do{
  254. cout << endl;
  255. cout << "IZBORNIK" << endl << endl;
  256. cout << "1.Unos zivotinje" << endl;
  257. cout << "2.Popis zivotinja" << endl;
  258. cout << "3.Zivotinje dostavljene nakon 23.09.2012."<<endl;
  259. cout << "4.Brisanje prema nazivu zivotinje" << endl;
  260. cout << "5.Brisanje prema vrsti zivotinje" << endl;
  261. cout << "6.Silazno sortiranje zivotinja" << endl;
  262. cout << "9.Izlaz" << endl << endl;
  263. cout << "Odabir: ";
  264. cin >> odabir;
  265. system("cls");
  266. switch(odabir){
  267. case 1:
  268. if(!unos(L)){
  269. cout << "Neispravni podaci kod unosa!" << endl;
  270. }
  271. break;
  272. case 2:
  273. ispis(L);
  274. break;
  275. case 3:
  276. filterDostava(23,9,2012,L);
  277. break;
  278. case 4:
  279. if(brisiPremaNazivu(L)){
  280. cout << "Zapis je uspjesno obrisan." << endl;
  281. }
  282. else{
  283. cout << "Zapis nije pronadjen." << endl;
  284. }
  285. break;
  286. case 5:
  287. if(brisiPremaVrsti(L)){
  288. cout << "Zapis(i) je uspjesno obrisan(i)." << endl;
  289. }
  290. else{
  291. cout << "Zapis(i) nije pronadjen(i)." << endl;
  292. }
  293. break;
  294. case 6:
  295. SortirajCijenaNaziv(L);
  296. break;
  297. case 9:
  298. break;
  299. default:
  300. cout << "Pogresan odabir! Odaberite ponovno!" << endl;
  301. }
  302. }while(odabir != 9);
  303.  
  304. DeleteAllL(L);
  305. system("pause");
  306. return 0;
  307. }

Report this snippet  

Comments

RSS Icon Subscribe to comments
Posted By: mnovosel2 on November 11, 2012

Postoji posebna funkcija koja provjerava je li lista prazna što je drugačije nego u mojom implementaciji. Šifra se generira isto automatski, a sve ostale opcije su ostavljene korisniku za unos.

You need to login to post a comment.