Z4 Glavni program


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



Copy this code and paste it in your HTML
  1. #include <iostream>
  2. #include <windows.h>
  3.  
  4. #define LAMBDA 0
  5. #define GRESKA -1
  6. #define MAX_EL 200
  7. #define PUNO 1
  8. #define PRAZNO 0
  9. #define MAX_DULJINA 10
  10. #define LAMBDAO -1
  11. #define MAX_VELICINA_POLJA 18
  12. #define RAZMAK_X 5
  13. #define RAZMAK_Y 2
  14. typedef int labeltype;
  15.  
  16. #include "bstablo_pokazivac.h"
  17. #include "bstablo_polje.h"
  18. #include "ostablo.h"
  19.  
  20. using namespace std;
  21.  
  22. #ifdef BSTABLO_POLJE_H
  23. void ispis(btree t){
  24. if(t==NULL) return;
  25. node n;
  26. for(n=0; n<MAX_EL;n++)
  27. if(t->elements[n].used==1)
  28. cout << n << " :: " << LabelB(n,t) << endl;
  29. }
  30. #endif
  31.  
  32. void Dodaj_element(labeltype vrijednost,node n,btree T){
  33. if(T==NULL) return;
  34. if(vrijednost < LabelB(n,T)){
  35. if(ExistsLeftChildB(n,T))
  36. Dodaj_element(vrijednost,LeftChildB(n,T),T);
  37. else
  38. if(CreateLeftB(vrijednost,n,T)==GRESKA) cout << "Greska" << endl;
  39. }
  40. else if(vrijednost > LabelB(n,T)){
  41. if(ExistsRightChildB(n,T))
  42. Dodaj_element(vrijednost,RightChildB(n,T),T);
  43. else
  44. if(CreateRightB(vrijednost,n,T)==GRESKA) cout << "Greska" << endl;
  45. }
  46. }
  47. void Ispis_stabla(node n,btree T){
  48. if(T==NULL) return;
  49. cout << " " << n << " : " << LabelB(n,T) << endl;
  50. if(ExistsLeftChildB(n,T)){
  51. Ispis_stabla(LeftChildB(n,T),T);
  52. }
  53. if(ExistsRightChildB(n,T)){
  54. Ispis_stabla(RightChildB(n,T),T);
  55. }
  56. }
  57. node Vrati_adresu(labeltype v,node n,btree T){
  58. if(T==NULL) return NULL;
  59. while(n != LAMBDA){
  60. if(v == LabelB(n,T)) return n;
  61. else if(v < LabelB(n,T)){
  62. if(ExistsLeftChildB(n,T))
  63. n = LeftChildB(n,T);
  64. else return 0;
  65. }
  66. else if(v > LabelB(n,T)){
  67. if(ExistsRightChildB(n,T))
  68. n = RightChildB(n,T);
  69. else return 0;
  70. }
  71. }
  72. return 0;
  73. }
  74. void Obrisi_vrijednost(labeltype vrijednost,node n,btree T){
  75. if(T==NULL) return;
  76. if(vrijednost == LabelB(n,T)) DeleteB(n,T);
  77. else{
  78. if(ExistsLeftChildB(n,T)){
  79. Obrisi_vrijednost(vrijednost,LeftChildB(n,T),T);
  80. }
  81. if(ExistsRightChildB(n,T)){
  82. Obrisi_vrijednost(vrijednost,RightChildB(n,T),T);
  83. }
  84. }
  85. }
  86. void Premjesti_zapis(node n,btree T,btree pom){
  87. if(T==NULL || pom==NULL) return;
  88. Dodaj_element(LabelB(n,T),RootB(pom),pom);
  89. if(ExistsLeftChildB(n,T))
  90. Premjesti_zapis(LeftChildB(n,T),T,pom);
  91. if(ExistsRightChildB(n,T))
  92. Premjesti_zapis(RightChildB(n,T),T,pom);
  93. }
  94.  
  95. void gotoxy(int x,int y){
  96. COORD coord;
  97. coord.X=x;
  98. coord.Y=y;
  99. SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),coord);
  100. }
  101.  
  102. void ispisi_sve(nodao n,tree *t){
  103. nodao cvor = FirstChildT(n,t);
  104. cout << " " << LabelT(n,t) << endl;
  105. while(cvor!=LAMBDAO){
  106. ispisi_sve(cvor,t);
  107. cvor=NextSiblingT(cvor,t);
  108. }
  109. }
  110. int prebroji(nodao n,tree *t){
  111. int br=0;
  112. nodao cvor = FirstChildT(n,t);
  113. while(cvor!=LAMBDAO){
  114. br++;
  115. cvor = NextSiblingT(cvor,t);
  116. }
  117. return br;
  118. }
  119. void nacrtaj(int x,int y,nodao n,tree *t){
  120. int pomak = prebroji(n,t);
  121. nodao cvor = FirstChildT(n,t);
  122. x-=(pomak*pomak);
  123. gotoxy(x,y);
  124. cout << LabelT(n,t);
  125. y+=RAZMAK_Y;
  126. while(cvor!=LAMBDAO){
  127. x+=RAZMAK_X;
  128. nacrtaj(x-pomak*4,y,cvor,t);
  129. cvor = NextSiblingT(cvor,t);
  130. }
  131. }
  132.  
  133.  
  134. int main(){
  135.  
  136. tree *t;
  137. t=InitT("0",t);
  138.  
  139. int c, i=1, izb, minus=0;
  140. char str[10];
  141. char error[MAX_DULJINA];
  142. strcpy(error,"Greska ");
  143.  
  144. int root,vrj,bri,mj1,mj2;
  145. btree stablo,pom;
  146. stablo = NULL;
  147. pom = NULL;
  148. node adr1,adr2;
  149. bool jep;
  150.  
  151. do{
  152. system("cls");
  153. printf(" MENI\n\n 1. Unesi korijen BS\n 2. Dodaj element u BS\n 3. Ispis BS\n");
  154. printf(" 4. Obrisi cvor BS\n 5. Trazi roditelja u BS\n 6. Zamijeni vrijednost cvora BS\n");
  155. printf(" 7. Dodaj element u OS\n 8. Ispis OS\n");
  156. printf(" 9. Obrisi vrijednost OS\n 0.Exit\n");
  157. printf("\n -------------------------------\n > ");
  158. cin >> izb;
  159. printf("\n\n");
  160. switch(izb){
  161. case 1: if(ExistsLeftChildB(RootB(stablo),stablo) || ExistsRightChildB(RootB(stablo),stablo)) break;
  162. cout << "Vrijednost korjena: "; cin >> root;
  163. stablo = InitB(root,stablo);
  164. break;
  165. case 2: printf(" ##################################################\n");
  166. printf(" # -1 prekida unos / ispisuje se svaki put #\n");
  167. printf(" ##################################################\n\n");
  168. do{
  169. cout << "Vrijednost: "; cin >> vrj;
  170. if(vrj!=-1) {
  171. Dodaj_element(vrj,RootB(stablo),stablo);
  172. cout<<"\n*****************\n";
  173. }
  174. else{
  175. Ispis_stabla(RootB(stablo),stablo);
  176. printf("\n*****************\n");
  177. }
  178. }while(vrj != -1);
  179. break;
  180. case 3: printf(" ##################################################\n");
  181. printf(" # ispis je PREORDER #\n");
  182. printf(" # ifdef BSTABLO_POLJE_H > ispis indeksa polja #\n");
  183. printf(" ##################################################\n\n");
  184. Ispis_stabla(RootB(stablo),stablo);
  185. #ifdef BSTABLO_POLJE_H
  186. printf("\n\n -- polje --\n\n");
  187. ispis(stablo);
  188. #endif
  189. break;
  190. case 4: printf("Brisi vrijednost: "); scanf("%d",&bri);
  191. jep=false;
  192. if(bri==LabelB(RootB(stablo),stablo)) jep=true;
  193. Obrisi_vrijednost(bri,RootB(stablo),stablo);
  194. if(jep){
  195. cout << "Vrijednost korjena: "; cin >> root;
  196. stablo = InitB(root,stablo);
  197. }
  198. Ispis_stabla(RootB(stablo),stablo);
  199. break;
  200. case 5: cout << "Roditelj od: "; cin >> vrj;
  201. adr1 = Vrati_adresu(vrj,RootB(stablo),stablo);
  202. cout << "Adresa trazenog: " << adr1 << endl;
  203. adr2 = ParentB(adr1,stablo);
  204. cout << "Adresa roditelja: " << adr2 << endl;
  205. if(adr1 == 0){
  206. printf("Nema tog elementa\n");
  207. break;
  208. }
  209. if(adr2 == 0){
  210. printf("Korjen\n");
  211. break;
  212. }
  213. printf(" je -> %d\n",LabelB(adr2,stablo));
  214. break;
  215. case 6: if(stablo==NULL) break;
  216. Ispis_stabla(RootB(stablo),stablo);
  217. cout << "\nPromjeniti vrijednost: "; cin >> mj1;
  218. cout << "Na vrijednost: "; cin >> mj2;
  219. adr1 = Vrati_adresu(mj1,RootB(stablo),stablo);
  220. if(adr1==NULL){
  221. printf("Nema te vrijednosti\n");
  222. break;
  223. }
  224. ChangeLabelB(mj2,Vrati_adresu(mj1,RootB(stablo),stablo),stablo);
  225. if(pom!=NULL) Obrisi_vrijednost(LabelB(RootB(pom),pom),RootB(pom),pom);
  226. pom = InitB(LabelB(RootB(stablo),stablo),pom);
  227. Premjesti_zapis(RootB(stablo),stablo,pom);
  228. Obrisi_vrijednost(LabelB(RootB(stablo),stablo),RootB(stablo),stablo);
  229. stablo = InitB(LabelB(RootB(pom),pom),stablo);
  230. Premjesti_zapis(RootB(pom),pom,stablo);
  231. break;
  232. case 7:
  233. system("cls");
  234. do{
  235. gotoxy(0,0);
  236. cout << "> "; cin >> c;
  237. system("cls");
  238. if(c!=-1 && c<i-minus){
  239. itoa(i++,str,10);
  240. if(CreateT(str,c,t)){
  241. gotoxy(1,1);
  242. strcat(error,str);
  243. cout << error << endl;
  244. strcpy(error,"Greska ");
  245. }
  246. nacrtaj(60,2,RootT(t),t);
  247. }
  248. }while(c!=-1);
  249. nacrtaj(60,2,RootT(t),t);
  250. break;
  251. case 8:
  252. system("cls");
  253. ispisi_sve(0,t);
  254. break;
  255. case 9:
  256. system("cls");
  257. nacrtaj(60,2,RootT(t),t);
  258. gotoxy(0,0); cout <<"B> "; cin >> c;
  259. minus+=prebroji(c,t);
  260. DeleteT(c,t);
  261. system("cls");
  262. nacrtaj(60,2,RootT(t),t);
  263. } /*switch*/
  264. //printf("\n\n--------------------\n");
  265. system("pause>NUL");
  266. }while(izb!=0);
  267. }

Report this snippet


Comments

RSS Icon Subscribe to comments

You need to login to post a comment.