Return to Snippet

Revision: 38707
at January 6, 2011 08:11 by masrnec


Initial Code
#include <iostream>

#define IZLAZ    0
#define GRESKA   -1
#define MAX_EL  200
#define PUNO      1
#define PRAZNO    0
typedef int labeltype;


#include "bstablo_polje.h"
//#include "bstablo_pokazivac.h"
using namespace std;


void Dodaj_element(labeltype vrijednost,node n,btree T){
    if(T==NULL) return; 
    if(vrijednost < LabelB(n,T)){
         if(ExistsLeftChildB(n,T))
              Dodaj_element(vrijednost,LeftChildB(n,T),T);
         else
              if(CreateLeftB(vrijednost,n,T)==GRESKA) cout << "Greska" << endl;
    }
    else if(vrijednost > LabelB(n,T)){
         if(ExistsRightChildB(n,T))
              Dodaj_element(vrijednost,RightChildB(n,T),T);
         else
              if(CreateRightB(vrijednost,n,T)==GRESKA) cout << "Greska" << endl;
    }
}
void Ispis_stabla(node n,btree T){
   if(T==NULL) return;
   cout << " " << n <<  "  :  " << LabelB(n,T) << endl;
   if(ExistsLeftChildB(n,T)){
       Ispis_stabla(LeftChildB(n,T),T);
   }
   if(ExistsRightChildB(n,T)){
       Ispis_stabla(RightChildB(n,T),T);
   }   
}
node Vrati_adresu(labeltype v,node n,btree T){
  if(T==NULL) return NULL;
  while(n != IZLAZ){
       if(v == LabelB(n,T)) return n;
       else if(v < LabelB(n,T)){
            if(ExistsLeftChildB(n,T))
                 n = LeftChildB(n,T);
            else return 0;
       }
       else if(v > LabelB(n,T)){
            if(ExistsRightChildB(n,T))
                 n = RightChildB(n,T);    
            else return 0;
       }
  }
  return 0;
}
void Obrisi_vrijednost(labeltype vrijednost,node n,btree T){
   if(T==NULL) return;
   if(vrijednost == LabelB(n,T)) DeleteB(n,T);
   else{
       if(ExistsLeftChildB(n,T)){
           Obrisi_vrijednost(vrijednost,LeftChildB(n,T),T);
       }
       if(ExistsRightChildB(n,T)){
           Obrisi_vrijednost(vrijednost,RightChildB(n,T),T);
       }   
   }
}
void Premjesti_zapis(node n,btree T,btree pom){
   if(T==NULL || pom==NULL) return;
   Dodaj_element(LabelB(n,T),RootB(pom),pom);
   if(ExistsLeftChildB(n,T))
          Premjesti_zapis(LeftChildB(n,T),T,pom);
   if(ExistsRightChildB(n,T))
          Premjesti_zapis(RightChildB(n,T),T,pom);
}

int main(){
    int korijen,vrijednost,brisi,mj1,mj2;
    btree stablo,pom;
    stablo = NULL;
    pom = NULL;
    int izbor;
    node adr1,adr2;
    bool jep;
    
    do{
        system("cls");
        cout<<"-----------------------------------"<<endl;
        cout<<" 1. korijen stabla (root)"<<endl;
        cout<<" 2. dodaj element"<<endl;
        cout<<" 3. ispis stabla"<<endl;
        cout<<" 4. obrisi vrijednost"<<endl;
        cout<<" 5. roditelj"<<endl;
        cout<<" 6. promijeni vrijednost"<<endl;
        cout<<" 9. izlaz"<<endl;;
        cout<<"-----------------------------------"<<endl;
        cin >> izbor;
        cout<<"\n\n";
        switch(izbor){
            case 1: if(ExistsLeftChildB(RootB(stablo),stablo) || ExistsRightChildB(RootB(stablo),stablo)) break;
                    cout << "Vrijednost korjena: "; cin >> korijen;
                    stablo = InitB(korijen,stablo);
                    break;
            case 2: 
                    do{
                       cout << "Vrijednost: "; cin >> vrijednost;
                       if(vrijednost!=-1) Dodaj_element(vrijednost,RootB(stablo),stablo);
                       cout<<"---"<<endl;
                       Ispis_stabla(RootB(stablo),stablo);
                       cout<<"---"<<endl;
                    }while(vrijednost != -1);
                    break;
           case 3: Ispis_stabla(RootB(stablo),stablo);
                   break;
           case 4: printf("Brisi vrijednost: "); scanf("%d",&brisi);
                   jep=false;
                   if(brisi==LabelB(RootB(stablo),stablo)) jep=true;
                   Obrisi_vrijednost(brisi,RootB(stablo),stablo);
                   if(jep){
                       cout << "Vrijednost korijena: "; cin >> korijen;
                       stablo = InitB(korijen,stablo);                                                              
                   }
                   Ispis_stabla(RootB(stablo),stablo);
                   break;
           case 5: cout << "Roditelj od: "; cin >> vrijednost;
                   adr1 = Vrati_adresu(vrijednost,RootB(stablo),stablo);
                   cout << "Adresa trazenog:  " << adr1 << endl;
                   adr2 = ParentB(adr1,stablo);
                   cout << "Adresa roditelja: " << adr2 << endl;
                   if(adr1 == 0){
                         cout<<"Nema tog elementa\n"; 
                         break;
                   }
                   if(adr2 == 0){
                         cout<<"Korijen\n";
                         break;
                   }
                   printf("   je ->  %d\n",LabelB(adr2,stablo));
                   break;
           case 6: if(stablo==NULL) break;
                   Ispis_stabla(RootB(stablo),stablo);
                   cout << "\nPromjeniti vrijednost: "; cin >> mj1; 
                   cout << "Na vrijednost: "; cin >> mj2;
                   adr1 = Vrati_adresu(mj1,RootB(stablo),stablo);
                   if(adr1==NULL){
                        cout<<"Nema te vrijednosti\n";
                        break;
                   }
                   ChangeLabelB(mj2,Vrati_adresu(mj1,RootB(stablo),stablo),stablo);
                   if(pom!=NULL) Obrisi_vrijednost(LabelB(RootB(pom),pom),RootB(pom),pom);
                   pom = InitB(LabelB(RootB(stablo),stablo),pom);
                   Premjesti_zapis(RootB(stablo),stablo,pom);
                   Obrisi_vrijednost(LabelB(RootB(stablo),stablo),RootB(stablo),stablo);
                   stablo = InitB(LabelB(RootB(pom),pom),stablo);
                   Premjesti_zapis(RootB(pom),pom,stablo);
        } 
        cout<<"\n\n--------------------\n";
        system("pause");
    }while(izbor!=9);
}

Initial URL


Initial Description


Initial Title
binarno stablo - glavni program

Initial Tags


Initial Language
C++