Posted By

sanovinic on 01/06/11


Tagged


Versions (?)

Main -binarno stablo


 / Published in: C++
 

  1. #include <iostream>
  2.  
  3. #define LAMBD 0
  4. #define POGRESKA -1
  5. #define M_ELE 200
  6. #define PUNO 1
  7. #define NISTA 0
  8. typedef int labeltype;
  9.  
  10. //#include "bin_stablo_pokazivac.h"
  11. #include "bin_stablo_polje.h"
  12.  
  13. using namespace std;
  14.  
  15. #ifdef BSTABLO_POLJE_H
  16. void ispisi(btree t){
  17. if(t==NULL) return;
  18. node n;
  19. for(n=0; n<M_ELE;n++)
  20. if(t->elements[n].used==1)
  21. cout << n << " :: " << LabelB(n,t) << endl;
  22. }
  23. #endif
  24.  
  25. void DodajElement(labeltype vrijednost,node n,btree T){
  26. if(T==NULL) return;
  27. if(vrijednost < LabelB(n,T)){
  28. if(ExistsLeftChildB(n,T))
  29. DodajElement(vrijednost,LeftChildB(n,T),T);
  30. else
  31. if(CreateLeftB(vrijednost,n,T)==POGRESKA) cout << "Pogreska" << endl;
  32. }
  33. else if(vrijednost > LabelB(n,T)){
  34. if(ExistsRightChildB(n,T))
  35. DodajElement(vrijednost,RightChildB(n,T),T);
  36. else
  37. if(CreateRightB(vrijednost,n,T)==POGRESKA) cout << "Pogreska" << endl;
  38. }
  39. }
  40. void IspisiStabla(node n,btree T){
  41. if(T==NULL) return;
  42. cout << " " << n << " : " << LabelB(n,T) << endl;
  43. if(ExistsLeftChildB(n,T)){
  44. IspisiStabla(LeftChildB(n,T),T);
  45. }
  46. if(ExistsRightChildB(n,T)){
  47. IspisiStabla(RightChildB(n,T),T);
  48. }
  49. }
  50. node VratiAdresu(labeltype v,node n,btree T){
  51. if(T==NULL) return NULL;
  52. while(n != LAMBD){
  53. if(v == LabelB(n,T)) return n;
  54. else if(v < LabelB(n,T)){
  55. if(ExistsLeftChildB(n,T))
  56. n = LeftChildB(n,T);
  57. else return 0;
  58. }
  59. else if(v > LabelB(n,T)){
  60. if(ExistsRightChildB(n,T))
  61. n = RightChildB(n,T);
  62. else return 0;
  63. }
  64. }
  65. return 0;
  66. }
  67. void BrisiVrijednost(labeltype vrijednost,node n,btree T){
  68. if(T==NULL) return;
  69. if(vrijednost == LabelB(n,T)) DeleteB(n,T);
  70. else{
  71. if(ExistsLeftChildB(n,T)){
  72. BrisiVrijednost(vrijednost,LeftChildB(n,T),T);
  73. }
  74. if(ExistsRightChildB(n,T)){
  75. BrisiVrijednost(vrijednost,RightChildB(n,T),T);
  76. }
  77. }
  78. }
  79. void PremjestiZapis(node n,btree T,btree pom){
  80. if(T==NULL || pom==NULL) return;
  81. DodajElement(LabelB(n,T),RootB(pom),pom);
  82. if(ExistsLeftChildB(n,T))
  83. PremjestiZapis(LeftChildB(n,T),T,pom);
  84. if(ExistsRightChildB(n,T))
  85. PremjestiZapis(RightChildB(n,T),T,pom);
  86. }
  87.  
  88. int main(){
  89. int root,vrj,bri,mj1,mj2;
  90. btree stablo,pom;
  91. stablo = NULL;
  92. pom = NULL;
  93. int izb;
  94. node adr1,adr2;
  95. bool jep;
  96.  
  97. do{
  98. system("cls");
  99. printf(" 1. Funkcija Root\n");
  100. printf(" 2. Funkcija Dodaj element\n ");
  101. printf("3. Funkcija Ispis stabla\n");
  102. printf(" 4. Funkcija Brisi vrijednost\n ");
  103. printf("5. Funkcija roditelj\n");
  104. printf(" 6. Funkcija ChangeLabelB\n ");
  105. printf("9. Exit");
  106. printf("\n--------------------\n Izbor : ");
  107. cin >> izb;
  108. printf("\n\n");
  109. switch(izb){
  110. case 1: if(ExistsLeftChildB(RootB(stablo),stablo) || ExistsRightChildB(RootB(stablo),stablo)) break;
  111. cout << "Vrijednost korijena: "; cin >> root;
  112. stablo = InitB(root,stablo);
  113. break;
  114.  
  115. case 2: printf(" # Za prekid unosa koristiti -1 #\n");
  116. do{
  117. cout << "Vrijednost: "; cin >> vrj;
  118. if(vrj!=-1) DodajElement(vrj,RootB(stablo),stablo);
  119. printf("\n*****************\n");
  120. IspisiStabla(RootB(stablo),stablo);
  121. printf("\n*****************\n");
  122. }while(vrj != -1);
  123. break;
  124.  
  125. case 3: IspisiStabla(RootB(stablo),stablo);
  126. #ifdef BSTABLO_POLJE_H
  127. printf("\n\n -- polje --\n\n");
  128. ispisi(stablo);
  129. #endif
  130. break;
  131.  
  132. case 4: printf("Brisi vrijednost: "); scanf("%d",&bri);
  133. jep=false;
  134. if(bri==LabelB(RootB(stablo),stablo)) jep=true;
  135. BrisiVrijednost(bri,RootB(stablo),stablo);
  136. if(jep){
  137. cout << "Vrijednost korijena: "; cin >> root;
  138. stablo = InitB(root,stablo);
  139. }
  140. IspisiStabla(RootB(stablo),stablo);
  141. break;
  142. case 5: cout << "Roditelj od: "; cin >> vrj;
  143. adr1 = VratiAdresu(vrj,RootB(stablo),stablo);
  144. cout << "Adresa trazenog: " << adr1 << endl;
  145. adr2 = ParentB(adr1,stablo);
  146. cout << "Adresa roditelja: " << adr2 << endl;
  147. if(adr1 == 0){
  148. printf("Nema tog elementa\n");
  149. break;
  150. }
  151. if(adr2 == 0){
  152. printf("Korijen\n");
  153. break;
  154. }
  155. printf(" je -> %d\n",LabelB(adr2,stablo));
  156. break;
  157. case 6: if(stablo==NULL) break;
  158. IspisiStabla(RootB(stablo),stablo);
  159. cout << "\nPromjeniti vrijednost: "; cin >> mj1;
  160. cout << "Na vrijednost: "; cin >> mj2;
  161. adr1 = VratiAdresu(mj1,RootB(stablo),stablo);
  162. if(adr1==NULL){
  163. printf("Nema te vrijednosti\n");
  164. break;
  165. }
  166. ChangeLabelB(mj2,VratiAdresu(mj1,RootB(stablo),stablo),stablo);
  167. if(pom!=NULL) BrisiVrijednost(LabelB(RootB(pom),pom),RootB(pom),pom);
  168. pom = InitB(LabelB(RootB(stablo),stablo),pom);
  169. PremjestiZapis(RootB(stablo),stablo,pom);
  170. BrisiVrijednost(LabelB(RootB(stablo),stablo),RootB(stablo),stablo);
  171. stablo = InitB(LabelB(RootB(pom),pom),stablo);
  172. PremjestiZapis(RootB(pom),pom,stablo);
  173. } /*switch*/
  174. printf("\n\n--------------------\n");
  175. system("pause>NUL");
  176. }while(izb!=9);
  177. }

Report this snippet  

You need to login to post a comment.