Posted By

Pvrbek on 11/12/12


Tagged

Strukture podatakaFOI


Versions (?)

Strukture podataka/Evidencija životinja/Lista pokazivaca


 / Published in: C++
 

Ovo je moja druga lista implementirana pomoću pokazivača koju mogu koristiti u glavnom programu.

  1. #include<iostream>
  2. using namespace std;
  3. struct zivine{
  4. int sifra;
  5. char vrsta[40];
  6. char naziv[40];
  7. float cijena;
  8. int dat[3];
  9. };
  10. struct Zapis_L{
  11. zivine vrj;
  12. Zapis_L *sljedeci;
  13. };
  14. typedef Zapis_L *clan;
  15. typedef Zapis_L lis;
  16. clan EndL(lis *L){
  17. return 0;
  18. }
  19. clan FirstL(lis *L){
  20. if(L->sljedeci==NULL) return EndL(L);
  21. else
  22. return L->sljedeci;
  23. }
  24. lis *InitL(lis *L){
  25. L=new lis;
  26. L->sljedeci=NULL;
  27. return L;}
  28. clan PreviousL(clan p, lis *L){
  29. if(p==FirstL(L)) return 0;
  30. if(p==EndL(L)){
  31. while(L->sljedeci)
  32. L=L->sljedeci;
  33. }
  34. else{
  35. while(p!=L->sljedeci)
  36. L=L->sljedeci;
  37. }
  38. return L;
  39. }
  40. zivine RetreiveL(clan p, lis *L){
  41. return p->vrj;}
  42. int InsertL(zivine x, lis *p, lis *L){
  43. lis *novi;
  44. if(p>L->sljedeci || p<0) return 0;
  45. if(p==EndL(L)){
  46. while(L->sljedeci)
  47. L=L->sljedeci;
  48. novi=new lis;
  49. L->sljedeci=novi;
  50. novi->sljedeci=NULL;
  51. novi->vrj=x;
  52. return 1;
  53. }
  54. else{
  55. p=PreviousL(p,L);
  56. novi=new lis;
  57. novi->sljedeci=L->sljedeci;
  58. p->sljedeci=novi;
  59. novi->vrj=x;
  60. return 1;
  61. }
  62. }
  63. clan NextL(clan p, lis *L){
  64. if(p->sljedeci==NULL) return EndL(L);
  65. if(p==EndL(L)) return 0;
  66. else{
  67. return p->sljedeci;
  68. }
  69. }
  70. int DeleteL(clan p, lis *L){
  71. clan prethodni, tekuci;
  72. tekuci=p;
  73. if(tekuci==EndL(L))return 0;
  74. if(p==FirstL(L)){
  75. L->sljedeci=tekuci->sljedeci;
  76. delete tekuci;
  77. return 1;
  78. }
  79. else{
  80. prethodni=PreviousL(tekuci,L);
  81. prethodni->sljedeci=tekuci->sljedeci;
  82. delete tekuci;
  83. return 1;
  84. }
  85. return 0;
  86. }
  87. clan LocateL(zivine x, lis *L){
  88. clan pozicija=EndL(L);
  89. pozicija=PreviousL(pozicija,L);
  90. if(strlen(x.naziv)>0){
  91. if(EndL(L)!=FirstL(L)){
  92. while(5){
  93. zivine tekuci=RetreiveL(pozicija,L);
  94. if(strcmp(x.naziv,tekuci.naziv)==0)
  95. return pozicija;
  96. if(pozicija==FirstL(L))break;
  97. pozicija=PreviousL(pozicija,L);
  98. }
  99. }
  100. }
  101. if(strlen(x.vrsta)>0){
  102. if(EndL(L)!=FirstL(L)){
  103. while(5){
  104. zivine tekuci=RetreiveL(pozicija,L);
  105. if(strcmp(x.vrsta,tekuci.vrsta)==0)
  106. return pozicija;
  107. if(pozicija==FirstL(L))break;
  108. pozicija=PreviousL(pozicija,L);
  109. }
  110. }
  111. }
  112. return EndL(L);
  113. }
  114. clan DeleteAll(lis *L){
  115. clan tekuci,prijasnji;
  116. prijasnji=L;
  117. tekuci=L->sljedeci;
  118. while(tekuci){
  119. delete prijasnji;
  120. prijasnji=tekuci;
  121. tekuci=tekuci->sljedeci;
  122. }
  123. delete prijasnji;
  124. L=NULL;
  125. return NULL;
  126. }
  127. void Merge(zivine polje[],int i, int k, int j){
  128. int start=i, zad=k+1, br=0, vel=j-i+1;
  129. zivine *pom=new zivine[j-i+1];
  130. while(start<=k && zad<=j){
  131. if(polje[start].cijena>polje[zad].cijena)
  132. pom[br++]=polje[start++];
  133. else if(polje[start].cijena<polje[zad].cijena)
  134. pom[br++]=polje[zad++];
  135. if(polje[start].cijena==polje[zad].cijena){
  136. if(strcmp(polje[start].naziv,polje[zad].naziv)==1)
  137. pom[br++]=polje[start++];
  138. else
  139. pom[br++]=polje[zad++];
  140. }
  141. }
  142. while(start<=k)
  143. pom[br++]=polje[start++];
  144. while(zad<=j)
  145. pom[br++]=polje[zad++];
  146. for(int I=0;I<vel;I++)
  147. polje[i+I]=pom[I];
  148. delete []pom;
  149. }
  150. void Zapis(zivine polje[],int i, int j){
  151. int sred;
  152. if(i<j){
  153. sred=(i+j)/2;
  154. Zapis(polje,i,sred);
  155. Zapis(polje,sred+1,j);
  156. Merge(polje,i,sred,j);
  157. }
  158. }
  159. void Stavi(zivine polje[],int velicina){
  160. clan sortirana=InitL(sortirana);
  161. clan novi,zadnji;
  162. zadnji=sortirana;
  163. for(int i=0; i<velicina;i++){
  164. while(zadnji->sljedeci)
  165. zadnji=zadnji->sljedeci;
  166. novi=new lis;
  167. zadnji->sljedeci=novi;
  168. novi->sljedeci=NULL;
  169. novi->vrj.sifra=polje[i].sifra;
  170. strcpy(novi->vrj.naziv,polje[i].naziv);
  171. novi->vrj.dat[0]=polje[i].dat[0];
  172. novi->vrj.dat[1]=polje[i].dat[1];
  173. novi->vrj.dat[2]=polje[i].dat[2];
  174. strcpy(novi->vrj.vrsta,polje[i].vrsta);
  175. novi->vrj.cijena=polje[i].cijena;
  176. cout<<"Sifra: "<<novi->vrj.sifra<<endl;
  177. cout<<"Naziv: "<<novi->vrj.naziv<<endl;
  178. cout<<"Cijena: "<<novi->vrj.cijena<<endl;
  179. cout<<"Vrsta: "<<novi->vrj.vrsta<<endl;
  180. cout<<"Datum: "<<novi->vrj.dat[0]<<"."<<novi->vrj.dat[1]<<"."<<novi->vrj.dat[2]<<"."<<endl;
  181. cout<<endl;
  182. }
  183. }
  184. void Merge(lis *L,clan i, clan j){
  185. if(FirstL(L)!=EndL(L)){
  186. int velicina=0,br=0;
  187. clan zadnji;
  188. zadnji=L;
  189. while(zadnji->sljedeci){
  190. zadnji=zadnji->sljedeci;
  191. velicina++;
  192. }
  193. zivine *pom=new zivine[velicina];
  194. clan mjesto=L->sljedeci;
  195. while(mjesto){
  196. pom[br++]=RetreiveL(mjesto,L);
  197. mjesto=mjesto->sljedeci;
  198. }
  199. Zapis(pom,0,velicina-1);
  200. Stavi(pom,velicina);
  201. }
  202. else
  203. cout<<"Prazna lista! "<<endl;
  204. }

Report this snippet  

You need to login to post a comment.