Posted By

masrnec on 01/06/11


Tagged


Versions (?)

binarno stablo - glavni program


 / Published in: C++
 

  1. #include <iostream>
  2.  
  3. #define IZLAZ 0
  4. #define GRESKA -1
  5. #define MAX_EL 200
  6. #define PUNO 1
  7. #define PRAZNO 0
  8. typedef int labeltype;
  9.  
  10.  
  11. #include "bstablo_polje.h"
  12. //#include "bstablo_pokazivac.h"
  13. using namespace std;
  14.  
  15.  
  16. void Dodaj_element(labeltype vrijednost,node n,btree T){
  17. if(T==NULL) return;
  18. if(vrijednost < LabelB(n,T)){
  19. if(ExistsLeftChildB(n,T))
  20. Dodaj_element(vrijednost,LeftChildB(n,T),T);
  21. else
  22. if(CreateLeftB(vrijednost,n,T)==GRESKA) cout << "Greska" << endl;
  23. }
  24. else if(vrijednost > LabelB(n,T)){
  25. if(ExistsRightChildB(n,T))
  26. Dodaj_element(vrijednost,RightChildB(n,T),T);
  27. else
  28. if(CreateRightB(vrijednost,n,T)==GRESKA) cout << "Greska" << endl;
  29. }
  30. }
  31. void Ispis_stabla(node n,btree T){
  32. if(T==NULL) return;
  33. cout << " " << n << " : " << LabelB(n,T) << endl;
  34. if(ExistsLeftChildB(n,T)){
  35. Ispis_stabla(LeftChildB(n,T),T);
  36. }
  37. if(ExistsRightChildB(n,T)){
  38. Ispis_stabla(RightChildB(n,T),T);
  39. }
  40. }
  41. node Vrati_adresu(labeltype v,node n,btree T){
  42. if(T==NULL) return NULL;
  43. while(n != IZLAZ){
  44. if(v == LabelB(n,T)) return n;
  45. else if(v < LabelB(n,T)){
  46. if(ExistsLeftChildB(n,T))
  47. n = LeftChildB(n,T);
  48. else return 0;
  49. }
  50. else if(v > LabelB(n,T)){
  51. if(ExistsRightChildB(n,T))
  52. n = RightChildB(n,T);
  53. else return 0;
  54. }
  55. }
  56. return 0;
  57. }
  58. void Obrisi_vrijednost(labeltype vrijednost,node n,btree T){
  59. if(T==NULL) return;
  60. if(vrijednost == LabelB(n,T)) DeleteB(n,T);
  61. else{
  62. if(ExistsLeftChildB(n,T)){
  63. Obrisi_vrijednost(vrijednost,LeftChildB(n,T),T);
  64. }
  65. if(ExistsRightChildB(n,T)){
  66. Obrisi_vrijednost(vrijednost,RightChildB(n,T),T);
  67. }
  68. }
  69. }
  70. void Premjesti_zapis(node n,btree T,btree pom){
  71. if(T==NULL || pom==NULL) return;
  72. Dodaj_element(LabelB(n,T),RootB(pom),pom);
  73. if(ExistsLeftChildB(n,T))
  74. Premjesti_zapis(LeftChildB(n,T),T,pom);
  75. if(ExistsRightChildB(n,T))
  76. Premjesti_zapis(RightChildB(n,T),T,pom);
  77. }
  78.  
  79. int main(){
  80. int korijen,vrijednost,brisi,mj1,mj2;
  81. btree stablo,pom;
  82. stablo = NULL;
  83. pom = NULL;
  84. int izbor;
  85. node adr1,adr2;
  86. bool jep;
  87.  
  88. do{
  89. system("cls");
  90. cout<<"-----------------------------------"<<endl;
  91. cout<<" 1. korijen stabla (root)"<<endl;
  92. cout<<" 2. dodaj element"<<endl;
  93. cout<<" 3. ispis stabla"<<endl;
  94. cout<<" 4. obrisi vrijednost"<<endl;
  95. cout<<" 5. roditelj"<<endl;
  96. cout<<" 6. promijeni vrijednost"<<endl;
  97. cout<<" 9. izlaz"<<endl;;
  98. cout<<"-----------------------------------"<<endl;
  99. cin >> izbor;
  100. cout<<"\n\n";
  101. switch(izbor){
  102. case 1: if(ExistsLeftChildB(RootB(stablo),stablo) || ExistsRightChildB(RootB(stablo),stablo)) break;
  103. cout << "Vrijednost korjena: "; cin >> korijen;
  104. stablo = InitB(korijen,stablo);
  105. break;
  106. case 2:
  107. do{
  108. cout << "Vrijednost: "; cin >> vrijednost;
  109. if(vrijednost!=-1) Dodaj_element(vrijednost,RootB(stablo),stablo);
  110. cout<<"---"<<endl;
  111. Ispis_stabla(RootB(stablo),stablo);
  112. cout<<"---"<<endl;
  113. }while(vrijednost != -1);
  114. break;
  115. case 3: Ispis_stabla(RootB(stablo),stablo);
  116. break;
  117. case 4: printf("Brisi vrijednost: "); scanf("%d",&brisi);
  118. jep=false;
  119. if(brisi==LabelB(RootB(stablo),stablo)) jep=true;
  120. Obrisi_vrijednost(brisi,RootB(stablo),stablo);
  121. if(jep){
  122. cout << "Vrijednost korijena: "; cin >> korijen;
  123. stablo = InitB(korijen,stablo);
  124. }
  125. Ispis_stabla(RootB(stablo),stablo);
  126. break;
  127. case 5: cout << "Roditelj od: "; cin >> vrijednost;
  128. adr1 = Vrati_adresu(vrijednost,RootB(stablo),stablo);
  129. cout << "Adresa trazenog: " << adr1 << endl;
  130. adr2 = ParentB(adr1,stablo);
  131. cout << "Adresa roditelja: " << adr2 << endl;
  132. if(adr1 == 0){
  133. cout<<"Nema tog elementa\n";
  134. break;
  135. }
  136. if(adr2 == 0){
  137. cout<<"Korijen\n";
  138. break;
  139. }
  140. printf(" je -> %d\n",LabelB(adr2,stablo));
  141. break;
  142. case 6: if(stablo==NULL) break;
  143. Ispis_stabla(RootB(stablo),stablo);
  144. cout << "\nPromjeniti vrijednost: "; cin >> mj1;
  145. cout << "Na vrijednost: "; cin >> mj2;
  146. adr1 = Vrati_adresu(mj1,RootB(stablo),stablo);
  147. if(adr1==NULL){
  148. cout<<"Nema te vrijednosti\n";
  149. break;
  150. }
  151. ChangeLabelB(mj2,Vrati_adresu(mj1,RootB(stablo),stablo),stablo);
  152. if(pom!=NULL) Obrisi_vrijednost(LabelB(RootB(pom),pom),RootB(pom),pom);
  153. pom = InitB(LabelB(RootB(stablo),stablo),pom);
  154. Premjesti_zapis(RootB(stablo),stablo,pom);
  155. Obrisi_vrijednost(LabelB(RootB(stablo),stablo),RootB(stablo),stablo);
  156. stablo = InitB(LabelB(RootB(pom),pom),stablo);
  157. Premjesti_zapis(RootB(pom),pom,stablo);
  158. }
  159. cout<<"\n\n--------------------\n";
  160. system("pause");
  161. }while(izbor!=9);
  162. }

Report this snippet  

You need to login to post a comment.