Zadatak 1 za kolegij Strukture podataka


/ Published in: C++
Save to your folder(s)

Glavni kod zadatka 1 sa komentarima


Copy this code and paste it in your HTML
  1. #include <iostream>
  2. #include <string>
  3. using namespace std;
  4. // #include "lista_polje.h"
  5. #include "lista_pokazivac.h"
  6.  
  7.  
  8.  
  9. int dodaj(int sifra, Lista *zivotinje){
  10. zivotinja nova;
  11. nova.sifra = sifra;
  12. cout << "Unesi naziv zivotinje: ";
  13. cin >> nova.naziv;
  14. cout << "Unesi vrstu: ";
  15. cin >> nova.vrsta;
  16. cout << "Unesi cijenu: ";
  17. cin >> nova.cijena;
  18. cout << "Unesi datum: ";
  19. cin >> nova.datum;
  20. // buduci da InsertL vraca 0 ili 1, mi to samo proslijedimo
  21. // tamo odakle je pozvan dodaj()
  22. return InsertL(nova, EndL(zivotinje), zivotinje);
  23. }
  24.  
  25.  
  26. void ispis(Lista *zivotinje) {
  27. element temp;
  28. zivotinja tmp;
  29. cout << endl;
  30. cout << "sifra\t naziv\t vrsta \t cijena \t datum" << endl;
  31. cout << "_________________________________________________________________" << endl;
  32.  
  33. temp = EndL(zivotinje);
  34. do {
  35. temp = PreviousL(temp, zivotinje);
  36. tmp = RetrieveL(temp, zivotinje);
  37.  
  38. cout << tmp.sifra << "\t" << tmp.naziv << "\t" << tmp.vrsta << "\t" << tmp.cijena << "\t" << tmp.datum << endl;
  39. } while (temp != FirstL(zivotinje));
  40. }
  41.  
  42.  
  43. void pretrazi(Lista *zivotinje) {
  44. cout << endl;
  45. cout << "Pretrazujemo listu za novijim zivotinjama." << endl;
  46. element temp;
  47. zivotinja tmp;
  48.  
  49. temp = FirstL(zivotinje);
  50.  
  51. do {
  52. tmp = RetrieveL(temp, zivotinje);
  53. if (tmp.datum > 20120923) {
  54. cout << "Naziv: " << tmp.naziv << ", datum: ";
  55. cout << tmp.datum << endl;
  56. }
  57. temp = NextL(temp, zivotinje);
  58. } while(temp != EndL(zivotinje));
  59. }
  60.  
  61.  
  62.  
  63. int brisi_naziv(string naziv, Lista *zivotinje) {
  64. element temp, prethodni;
  65. zivotinja tmp;
  66.  
  67. int brisanje = 0;
  68.  
  69. temp = FirstL(zivotinje);
  70. do {
  71. tmp = RetrieveL(temp, zivotinje);
  72. if (tmp.naziv == naziv) {
  73. prethodni = PreviousL(temp, zivotinje);
  74. DeleteL(temp, zivotinje);
  75. brisanje = 1;
  76. temp = prethodni;
  77. }
  78. temp = NextL(temp, zivotinje);
  79.  
  80. } while(temp != EndL(zivotinje));
  81.  
  82. return brisanje;
  83. }
  84.  
  85. int brisi_vrsta(string vrsta, Lista *zivotinje) {
  86. element temp, prethodni;
  87. zivotinja tmp;
  88.  
  89. int brisanje = 0;
  90.  
  91. temp = FirstL(zivotinje);
  92. do {
  93. tmp = RetrieveL(temp, zivotinje);
  94. if (tmp.vrsta == vrsta) {
  95. prethodni = PreviousL(temp, zivotinje);
  96. DeleteL(temp, zivotinje);
  97. brisanje = 1;
  98. temp = prethodni;
  99. }
  100. temp = NextL(temp, zivotinje);
  101.  
  102. } while(temp != EndL(zivotinje));
  103.  
  104. return brisanje;
  105. }
  106.  
  107.  
  108.  
  109. void merge_2(zivotinja polje[], int lijevi, int desni) {
  110. int sredina = (lijevi + desni) / 2;
  111. zivotinja temp;
  112.  
  113. if (desni - lijevi == 1) { // polje od 2 elem
  114. if (polje[desni].cijena > polje[lijevi].cijena) {
  115. temp = polje[desni];
  116. polje[desni] = polje[lijevi];
  117. polje[lijevi] = temp;
  118. return;
  119. }
  120. }
  121. else if (desni == lijevi) { // polje od 1 el
  122. return;
  123. }
  124. else {
  125. // rekurzija
  126. merge_2(polje, lijevi, sredina);
  127. merge_2(polje, sredina +1, desni);
  128. // spajanje dijelova
  129. int size_pomocno = desni-lijevi +1;
  130. zivotinja *polje_pomocno = new zivotinja[size_pomocno];
  131. int l = lijevi;
  132. int s = sredina +1;
  133.  
  134. for (int i = 0; i < size_pomocno; i++) {
  135. if (l == sredina+1) { // sad samo s vadi
  136. polje_pomocno[i] = polje[s]; s++;
  137. continue;
  138. }
  139. if (s == desni +1) { // samo l vadi)
  140. polje_pomocno[i] = polje[l]; l++;
  141. continue;
  142. }
  143.  
  144. if (polje[l].cijena > polje[s].cijena) {
  145. polje_pomocno[i] = polje[l];
  146. l++;
  147. }
  148. else {
  149. polje_pomocno[i] = polje[s];
  150. s++;
  151. }
  152. }
  153. // iz pomocnog iskopiraj u glavno, obrisi pomocno
  154. int j = 0;
  155. for (int i = lijevi; i <= desni; i++) {
  156. polje[i] = polje_pomocno[j]; j++;
  157. }
  158. // delete polje_pomocno; // kvar!
  159.  
  160. }
  161.  
  162. }
  163.  
  164.  
  165. void merge_1(zivotinja polje[], int lijevi, int desni) {
  166. int sredina = (lijevi + desni) / 2;
  167. zivotinja temp;
  168. if (desni - lijevi == 1) { // polje od 2 elem
  169. if (polje[desni].naziv > polje[lijevi].naziv) {
  170. temp = polje[desni];
  171. polje[desni] = polje[lijevi];
  172. polje[lijevi] = temp;
  173. return;
  174. }
  175. }
  176. else if (desni == lijevi) { // polje od 1 el
  177. return;
  178. }
  179. else {
  180. // rekurzija
  181. merge_1(polje, lijevi, sredina);
  182. merge_1(polje, sredina +1, desni);
  183. // spajanje dijelova
  184. int size_pomocno = desni-lijevi +1;
  185. zivotinja *polje_pomocno = new zivotinja[size_pomocno];
  186.  
  187. int l = lijevi;
  188. int s = sredina +1;
  189.  
  190. for (int i = 0; i < size_pomocno; i++) {
  191. if (l == sredina+1) { // sad samo s vadi
  192. polje_pomocno[i] = polje[s]; s++;
  193. continue;
  194. }
  195. if (s == desni +1) { // samo l vadi)
  196. polje_pomocno[i] = polje[l]; l++;
  197. continue;
  198. }
  199. if (polje[l].naziv > polje[s].naziv) {
  200. polje_pomocno[i] = polje[l];
  201. l++;
  202. }
  203. else {
  204. polje_pomocno[i] = polje[s];
  205. s++;
  206. }
  207. }
  208. // iz pomocnog iskopiraj u glavno, obrisi pomocno
  209. int j = 0;
  210. for (int i = lijevi; i <= desni; i++) {
  211. polje[i] = polje_pomocno[j]; j++;
  212. }
  213.  
  214. }
  215. }
  216.  
  217. int main() {
  218.  
  219. zivotinja prva, druga, treca, cetvrta, peta;
  220. prva.cijena = 100;
  221. prva.sifra = 1;
  222. prva.naziv = "Newfoundler";
  223. prva.vrsta = "pas";
  224. prva.datum = 20121010; // YYYYMMDD
  225.  
  226. Lista zivotinje;
  227. InitL(&zivotinje);
  228.  
  229. InsertL(prva, EndL(&zivotinje), &zivotinje);
  230.  
  231. druga.cijena = 5000000;
  232. druga.sifra = 2;
  233. druga.naziv = "Lav";
  234. druga.vrsta = "divlja macka";
  235. druga.datum = 20100505;
  236.  
  237. InsertL(druga, EndL(&zivotinje), &zivotinje);
  238.  
  239. treca.cijena = 50000;
  240. treca.sifra = 3;
  241. treca.naziv = "Pangolin";
  242. treca.vrsta = "mravojed";
  243. treca.datum = 20121105;
  244.  
  245. InsertL(treca, EndL(&zivotinje), &zivotinje);
  246.  
  247. cetvrta.cijena = 123;
  248. cetvrta.sifra = 4;
  249. cetvrta.naziv = "Russian blue";
  250. cetvrta.vrsta = "macka";
  251. cetvrta.datum = 20121511;
  252.  
  253. InsertL(cetvrta, EndL(&zivotinje), &zivotinje);
  254.  
  255. peta.cijena = 21;
  256. peta.sifra = 5;
  257. peta.naziv = "Tigar";
  258. peta.vrsta = "divlja macka";
  259. peta.datum = 20110105;
  260.  
  261. InsertL(peta, EndL(&zivotinje), &zivotinje);
  262.  
  263. int sifra = 6;
  264.  
  265. int rezultat = dodaj(sifra, &zivotinje);
  266. if (rezultat == 1) {
  267. cout << "Zivotinja uspjesno dodana." << endl;
  268. sifra++;
  269. }
  270. else {
  271. cout << "Neuspjelo dodavanje." << endl;
  272. }
  273.  
  274. // druga funkcija: ispis liste unatrag
  275. ispis(&zivotinje);
  276. // treca funkcija: pretrazivanje za datumom > 23.09.2012.
  277. pretrazi(&zivotinje);
  278.  
  279. // cetvrta funkcija: brisanje po nazivu
  280. cout << endl;
  281. cout << "Naziv zivotinje koju zelite obrisati: ";
  282. string naziv;
  283. cin >> naziv;
  284. if (brisi_naziv(naziv, &zivotinje) == 0) {
  285. cout << "Brisanje nije uspjelo (nepostojeca zivotinja?)" << endl << endl;
  286. }
  287. // ispisemo listu da vidimo radi li brisanje
  288. ispis(&zivotinje);
  289. cout << endl;
  290.  
  291. // peta funkcija: brisanje po vrsti
  292. cout << endl;
  293. cout << "Vrstu zivotinje koju zelite obrisati: ";
  294. string vrsta;
  295. cin >> vrsta;
  296. if (brisi_vrsta(vrsta, &zivotinje) == 0) {
  297. cout << "Brisanje nije uspjelo (nepostojeca zivotinja?)" << endl << endl;
  298. }
  299. // ispisemo listu da vidimo radi li brisanje
  300. ispis(&zivotinje);
  301. cout << endl;
  302.  
  303. // sortiranje
  304. // prvo ucitamo cijelu listu u jedno polje.
  305. // da bismo to mogli, moramo prebrojati koliko je el. u listi.
  306. element temp;
  307. zivotinja tmp;
  308. temp = FirstL(&zivotinje);
  309. int broj = 0;
  310. while (temp != EndL(&zivotinje)) {
  311. temp = NextL(temp, &zivotinje);
  312. ++broj;
  313. }
  314.  
  315. // stvorimo polje!
  316. zivotinja *polje_zivotinje = new zivotinja[broj];
  317.  
  318. // citamo iz liste, spremamo u polje
  319. temp = FirstL(&zivotinje);
  320. for (int i = 0; i < broj; ++i) {
  321. tmp = RetrieveL(temp, &zivotinje);
  322. temp = NextL(temp, &zivotinje);
  323. polje_zivotinje[i] = tmp;
  324. }
  325. // sad mozemo sortirati polje!
  326.  
  327. merge_1(polje_zivotinje, 0, broj-1); // sort po nazivu
  328. cout << endl;
  329. cout << endl << "Ispisujemo sortirani sadrzaj liste (po nazivu)." << endl;
  330. for (int i = 0; i < broj; i++) {
  331. cout << polje_zivotinje[i].naziv << endl;
  332. }
  333.  
  334. merge_2(polje_zivotinje, 0, broj-1); // po cijeni
  335. cout << endl;
  336. cout << endl << "Ispisujemo sortirani sadrzaj liste (po cijeni)." << endl;
  337. for (int i = 0; i < broj; i++) {
  338. cout << polje_zivotinje[i].naziv << " " << polje_zivotinje[i].cijena << endl;
  339. }
  340.  
  341. system("pause");
  342. return 0;
  343. }

URL: main_petrak

Report this snippet


Comments

RSS Icon Subscribe to comments

You need to login to post a comment.