Strukture podataka, zadatak 1, Darijan Mirkovic


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

Primjer programa za evidenciju životinja u trgovini sa kućnim ljubimcima, s listom polja i listom pokazivača.


Copy this code and paste it in your HTML
  1. #include <iostream>
  2. //#include "lista_polje.h"
  3. #include "lista_pokazivaci.h"
  4.  
  5. using namespace std;
  6.  
  7. int sifra;
  8.  
  9. int novi_unos(t_lista *L){
  10. cout << "Dodavanje nove zivotinje" << endl << endl;
  11. t_zivotinja x;
  12. cout << "Sifra: " << sifra << endl; x.sifra = sifra;
  13. cin.ignore();
  14. cout << "Vrsta: "; cin.getline(x.vrsta,20);
  15. cout << "Naziv: "; cin.getline(x.naziv,20);
  16. cout << "Cijena: "; cin >> x.cijena;
  17. cout << "Datum dostave: "; cin >> x.datum;
  18. int provjera = InsertL(x, EndL(L), L);
  19. if(provjera == OK){
  20. cout << endl << "Zapis je uspjesno dodan" << endl;
  21. sifra++;
  22. return 1;
  23. }
  24. return 0;
  25. }
  26.  
  27. int ispis(t_lista *L, int granica=20000101){
  28. if(EndL(L) == FirstL(L)) return 0;
  29. t_zivotinja x;
  30. int brojac = 0;
  31. element zadnji = PreviousL(EndL(L),L);
  32. while(true){
  33. x = RetrieveL(zadnji, L);
  34. if(x.datum<granica){
  35. if(zadnji == FirstL(L)) break;
  36. zadnji = PreviousL(zadnji, L);
  37. continue;
  38. }
  39. cout << "Sifra: " << x.sifra << endl;
  40. cout << "Vrsta: " << x.vrsta << endl;
  41. cout << "Naziv: " << x.naziv << endl;
  42. cout << "Cijena: " << x.cijena << endl;
  43. cout << "Datum dostave: " << x.datum << endl;
  44. cout << endl;
  45. brojac++;
  46. if(zadnji == FirstL(L)) break;
  47. zadnji = PreviousL(zadnji, L);
  48. }
  49. cout << "+-+-+-+" << endl;
  50. cout << "Ukupno zivotinja: " << brojac << endl;
  51. cout << "+-+-+-+" << endl;
  52. return 1;
  53. }
  54.  
  55. int brisi_po_nazivu(t_lista *L){
  56. cin.ignore();
  57. t_zivotinja x;
  58. x.sifra = 0;
  59. strcpy(x.vrsta,"");
  60. cout << "Unesite naziv: "; cin.getline(x.naziv,20);
  61. element p = LocateL(x,L);
  62. if( DeleteL(p,L) ) return 1;
  63. return 0;
  64. }
  65.  
  66. int brisi_po_vrsti(t_lista *L){
  67. cin.ignore();
  68. int brisano = false;
  69. t_zivotinja x;
  70. x.sifra = 0;
  71. strcpy(x.naziv,"");
  72. cout << "Unesite vrstu: "; cin.getline(x.vrsta,20);
  73. element p = LocateL(x,L);
  74. do{
  75. DeleteL(p,L);
  76. p = LocateL(x,L);
  77. }while(p!=EndL(L));
  78. if(brisano) return 1;
  79. return 0;
  80. }
  81.  
  82. void Spoji(t_zivotinja *A,int i,int k,int j) {
  83. int I=i, J=k+1, K=0;
  84. t_zivotinja *B = new t_zivotinja [j-i+1];
  85. while (I<=k && J<=j)
  86. if (A[I].cijena>A[J].cijena ||
  87. (A[I].cijena==A[J].cijena && strcmp(A[I].naziv,A[J].naziv)>0) )
  88. B[K++]=A[I++];
  89. else
  90. B[K++]=A[J++];
  91. if (I>k)
  92. while (J<=j)
  93. B[K++] = A[J++];
  94. else
  95. while (I<=k)
  96. B[K++] = A[I++];
  97. for (int I=0;I<=j-i;I++)
  98. A[i+I]=B[I];
  99. delete []B;
  100. }
  101. void MSort(t_zivotinja *A,int i, int j) {
  102. if (i<j) {
  103. int k=(i+j)/2;
  104. MSort(A,i,k);
  105. MSort(A,k+1,j);
  106. Spoji(A,i,k,j);
  107. }
  108. }
  109. void MSort(t_zivotinja *A,int N) {
  110. MSort(A,0,N-1);
  111. }
  112.  
  113. void sortiraj(t_lista *L){
  114. element zadnji = PreviousL(EndL(L),L);
  115. int brojac = 0;
  116. while(true){
  117. brojac++;
  118. if(zadnji == FirstL(L)) break;
  119. zadnji = PreviousL(zadnji, L);
  120. }
  121. t_zivotinja temp[brojac];
  122. zadnji = PreviousL(EndL(L),L);
  123. int i=0;
  124. while(true){
  125. temp[i++] = RetrieveL(zadnji, L);
  126. if(zadnji == FirstL(L)) break;
  127. zadnji = PreviousL(zadnji, L);
  128. }
  129. MSort(temp,brojac);
  130. DeleteAllL(L);
  131. for(int i=0; i<brojac; i++)
  132. InsertL(temp[i], EndL(L), L);
  133. }
  134.  
  135. int main(){
  136. int izbor;
  137.  
  138. t_lista *L = InitL(L);
  139. sifra = 1000;
  140.  
  141. do{
  142. cout << "1. Dodaj novu zivotinju" << endl;
  143. cout << "2. Ispis zivotinja" << endl;
  144. cout << "3. Ispis nakon 23.09.2012." << endl;
  145. cout << "4. Brisi po nazivu" << endl;
  146. cout << "5. Brisi cijelu vrsti" << endl;
  147. cout << "6. Sortiranje" << endl;
  148. cout << "0. Kraj" << endl;
  149. cout << "Vas izbor: ";
  150. cin >> izbor;
  151. cout << endl << endl;
  152. switch(izbor){
  153. case 1: novi_unos(L); break;
  154. case 2: ispis(L); break;
  155. case 3: ispis(L,20120923); break;
  156. case 4: brisi_po_nazivu(L); break;
  157. case 5: brisi_po_vrsti(L); break;
  158. case 6: sortiraj(L); break;
  159. case 0: cout << "Kraj rada" << endl; break;
  160. default: cout << "Krivi unos" << endl;
  161. }
  162. cout << endl << endl;
  163. }while(izbor);
  164.  
  165. return 0;
  166. }
  167.  
  168.  
  169.  
  170.  
  171.  
  172. //lista_pokazivaci.h
  173. #include <iostream>
  174. #include <string.h>
  175. #define OK 1
  176. #define ERROR -1
  177. using namespace std;
  178.  
  179. struct t_zivotinja{
  180. int sifra;
  181. char vrsta[20];
  182. char naziv[20];
  183. float cijena;
  184. unsigned int datum;
  185. };
  186.  
  187. struct t_lista{
  188. t_zivotinja zivotinja;
  189. t_lista *sljedeci;
  190. };
  191.  
  192. typedef t_lista *element;
  193.  
  194. element FirstL(t_lista *L){
  195. return L->sljedeci;
  196. }
  197.  
  198. element EndL(t_lista *L){
  199. t_lista *zadnji = L;
  200. while(zadnji->sljedeci)
  201. zadnji = zadnji->sljedeci;
  202. return zadnji;
  203. }
  204.  
  205. element NextL(element p, t_lista *L){
  206. if(p->sljedeci==NULL) return EndL(L);
  207. return p->sljedeci;
  208. }
  209.  
  210. element PreviousL(element p, t_lista *L){
  211. if(p == FirstL(L)) return NULL;
  212. t_lista *zadnji = L->sljedeci;
  213. while(p!=zadnji->sljedeci && zadnji->sljedeci!=NULL)
  214. zadnji = zadnji->sljedeci;
  215. return zadnji;
  216. }
  217.  
  218. element LocateL(t_zivotinja x, t_lista *L){
  219. t_lista *zadnji = L->sljedeci;
  220. while(zadnji){
  221. if(x.sifra==zadnji->zivotinja.sifra ||
  222. !strcmp(zadnji->zivotinja.naziv,x.naziv) ||
  223. !strcmp(zadnji->zivotinja.vrsta,x.vrsta))
  224. return zadnji;
  225. zadnji = zadnji->sljedeci;
  226. }
  227. return EndL(L);
  228. }
  229.  
  230. int InsertL(t_zivotinja x, element p, t_lista *L){
  231. t_lista *zadnji = p;
  232. t_lista *novi = new t_lista;
  233.  
  234. if(p == EndL(L)){
  235. novi->sljedeci = NULL;
  236. zadnji->sljedeci = novi;
  237. zadnji->zivotinja = x;
  238. } else if(p == FirstL(L)){
  239. novi->sljedeci = zadnji;
  240. L->sljedeci = novi;
  241. novi->zivotinja = x;
  242. } else{
  243. t_lista *prethodni = PreviousL(p,L);
  244. novi->sljedeci = prethodni->sljedeci;
  245. prethodni->sljedeci = novi;
  246. novi->zivotinja = x;
  247. }
  248. if(zadnji->zivotinja.sifra==x.sifra) return OK;
  249. return ERROR;
  250. }
  251.  
  252. int DeleteL(element p, t_lista *L){
  253. t_lista *prethodni, *zadnji = p;
  254. if(p == FirstL(L)){
  255. L->sljedeci = zadnji->sljedeci;
  256. delete zadnji;
  257. return 1;
  258. } else {
  259. prethodni = PreviousL(zadnji,L);
  260. prethodni->sljedeci = zadnji->sljedeci;
  261. delete zadnji;
  262. return 1;
  263. }
  264. return 0;
  265. }
  266.  
  267. t_zivotinja RetrieveL(element p, t_lista *L){
  268. return p->zivotinja;
  269. }
  270.  
  271. element DeleteAllL(t_lista *L){
  272. L->sljedeci = EndL(L);
  273. }
  274.  
  275. t_lista* InitL(t_lista *L){
  276. t_lista *zadnji = new t_lista;
  277. zadnji->sljedeci = NULL;
  278. L=new t_lista;
  279. L->sljedeci = zadnji;
  280. return L;
  281. }
  282.  
  283.  
  284. //lista_polja.h
  285. #include <iostream>
  286. #include <string.h>
  287. #define MAXLENGTH 1000
  288. #define OK 1
  289. #define ERROR -1
  290. using namespace std;
  291.  
  292. struct t_zivotinja{
  293. int sifra;
  294. char vrsta[20];
  295. char naziv[20];
  296. float cijena;
  297. unsigned int datum;
  298. };
  299.  
  300. struct t_lista{
  301. t_zivotinja zivotinja[MAXLENGTH];
  302. int pokazivac;
  303. };
  304.  
  305. typedef int element; //tip pokazivaca
  306.  
  307. element FirstL(t_lista *L){
  308. return 0;
  309. }
  310.  
  311. element EndL(t_lista *L){
  312. return L->pokazivac;
  313. }
  314.  
  315. element PreviousL(element p, t_lista *L){
  316. if(p == FirstL(L)) return ERROR;
  317. return p-1;
  318. }
  319.  
  320. element NextL(element p, t_lista *L){
  321. if(p == EndL(L)) return ERROR;
  322. if(p == PreviousL(EndL(L),L)) return EndL(L);
  323. return p+1;
  324. }
  325.  
  326. element LocateL(t_zivotinja x, t_lista *L){
  327. element p;
  328. for(p=0; p<EndL(L); p++)
  329. if(x.sifra==L->zivotinja[p].sifra ||
  330. !strcmp(L->zivotinja[p].naziv,x.naziv) ||
  331. !strcmp(L->zivotinja[p].vrsta,x.vrsta))
  332. return p;
  333. return EndL(L);
  334. }
  335.  
  336. element InsertL(t_zivotinja x, element p, t_lista *L){
  337. for(int i=EndL(L); i>p; i--)
  338. L->zivotinja[i] = L->zivotinja[i-1];
  339. L->zivotinja[p] = x;
  340. L->pokazivac++;
  341. if(x.sifra==L->zivotinja[p].sifra) return OK;
  342. return ERROR;
  343. }
  344.  
  345. element DeleteL(element p, t_lista *L){
  346. if(p == EndL(L)) return ERROR;
  347. int pokazivac_temp = L->pokazivac;
  348. for(int i=p; i<EndL(L); i++)
  349. L->zivotinja[i] = L->zivotinja[i+1];
  350. if(p != EndL(L)) L->pokazivac--;
  351. if(pokazivac_temp != L->pokazivac) return OK;
  352. return ERROR;
  353. }
  354.  
  355. t_zivotinja RetrieveL(element p, t_lista *L){
  356. return L->zivotinja[p];
  357. }
  358.  
  359. element DeleteAllL(t_lista *L){
  360. L->pokazivac = 0;
  361. return OK;
  362. }
  363.  
  364. t_lista* InitL(t_lista *L){
  365. L = new t_lista;
  366. L->pokazivac = 0;
  367. return L;
  368. }

Report this snippet


Comments

RSS Icon Subscribe to comments

You need to login to post a comment.