Posted By

PetraKuhar on 11/10/12


Tagged

zivotinje sortiranje unos brisanje ispis zadatak1


Versions (?)

Zadatak 1 za kolegij Strukture podataka


 / Published in: C++
 

URL: main_petrak

Glavni kod zadatka 1 sa komentarima

  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. }

Report this snippet  

Comments

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

Ovaj program, za razliku od mojeg, ne sadrži izbornik iz kojeg se biraju opcije vezane uz listu. Smatram da to smanjuje preglednost programa, iako ne utječe na samo odvijanje i vrijednost programa.

You need to login to post a comment.