## Posted By

mazorkovi on 01/06/11

# Z4 Glavni program

/ Published in: C++

`#include <iostream>#include <windows.h> #define LAMBDA                0#define GRESKA               -1#define MAX_EL              200#define PUNO                  1#define PRAZNO                0#define MAX_DULJINA          10#define LAMBDAO              -1#define MAX_VELICINA_POLJA   18#define RAZMAK_X              5#define RAZMAK_Y              2typedef int labeltype; #include "bstablo_pokazivac.h"#include "bstablo_polje.h"#include "ostablo.h" using namespace std; #ifdef BSTABLO_POLJE_Hvoid ispis(btree t){    if(t==NULL) return;    node n;    for(n=0; n<MAX_EL;n++)       if(t->elements[n].used==1)            cout << n << " :: " << LabelB(n,t) << endl;}#endif 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 != LAMBDA){       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);} void gotoxy(int x,int y){    COORD coord;    coord.X=x;        coord.Y=y;    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),coord); } void ispisi_sve(nodao n,tree *t){    nodao cvor = FirstChildT(n,t);    cout << "  " << LabelT(n,t) << endl;    while(cvor!=LAMBDAO){        ispisi_sve(cvor,t);        cvor=NextSiblingT(cvor,t);    }}int prebroji(nodao n,tree *t){    int br=0;    nodao cvor = FirstChildT(n,t);    while(cvor!=LAMBDAO){          br++;          cvor = NextSiblingT(cvor,t);    }    return br;}void nacrtaj(int x,int y,nodao n,tree *t){    int pomak = prebroji(n,t);    nodao cvor = FirstChildT(n,t);    x-=(pomak*pomak);    gotoxy(x,y);     cout << LabelT(n,t);    y+=RAZMAK_Y;    while(cvor!=LAMBDAO){         x+=RAZMAK_X;        nacrtaj(x-pomak*4,y,cvor,t);        cvor = NextSiblingT(cvor,t);    }}  int main(){     tree *t;    t=InitT("0",t);     int c, i=1, izb, minus=0;    char str[10];    char error[MAX_DULJINA];    strcpy(error,"Greska ");     int root,vrj,bri,mj1,mj2;    btree stablo,pom;    stablo = NULL;    pom = NULL;    node adr1,adr2;    bool jep;     do{        system("cls");        printf(" MENI\n\n 1. Unesi korijen BS\n 2. Dodaj element u BS\n 3. Ispis BS\n");        printf(" 4. Obrisi cvor BS\n 5. Trazi roditelja u BS\n 6. Zamijeni vrijednost cvora BS\n");        printf(" 7. Dodaj element u OS\n 8. Ispis OS\n");        printf(" 9. Obrisi vrijednost OS\n 0.Exit\n");        printf("\n -------------------------------\n > ");        cin >> izb;        printf("\n\n");        switch(izb){            case 1: if(ExistsLeftChildB(RootB(stablo),stablo) || ExistsRightChildB(RootB(stablo),stablo)) break;                    cout << "Vrijednost korjena: "; cin >> root;                    stablo = InitB(root,stablo);                    break;            case 2: printf(" ##################################################\n");                    printf(" #    -1 prekida unos / ispisuje se svaki put     #\n");                    printf(" ##################################################\n\n");                    do{                       cout << "Vrijednost: "; cin >> vrj;                       if(vrj!=-1) {                                   Dodaj_element(vrj,RootB(stablo),stablo);                                   cout<<"\n*****************\n";                                   }                       else{                       Ispis_stabla(RootB(stablo),stablo);                       printf("\n*****************\n");                       }                    }while(vrj != -1);                    break;           case 3: printf(" ##################################################\n");                   printf(" # ispis je   PREORDER                            #\n");                   printf(" # ifdef BSTABLO_POLJE_H > ispis indeksa polja    #\n");                   printf(" ##################################################\n\n");                   Ispis_stabla(RootB(stablo),stablo);                   #ifdef BSTABLO_POLJE_H                   printf("\n\n -- polje --\n\n");                   ispis(stablo);                   #endif                   break;           case 4: printf("Brisi vrijednost: "); scanf("%d",&bri);                   jep=false;                   if(bri==LabelB(RootB(stablo),stablo)) jep=true;                   Obrisi_vrijednost(bri,RootB(stablo),stablo);                   if(jep){                       cout << "Vrijednost korjena: "; cin >> root;                       stablo = InitB(root,stablo);                                                                                 }                   Ispis_stabla(RootB(stablo),stablo);                   break;           case 5: cout << "Roditelj od: "; cin >> vrj;                   adr1 = Vrati_adresu(vrj,RootB(stablo),stablo);                   cout << "Adresa trazenog:  " << adr1 << endl;                   adr2 = ParentB(adr1,stablo);                   cout << "Adresa roditelja: " << adr2 << endl;                   if(adr1 == 0){                         printf("Nema tog elementa\n");                          break;                   }                   if(adr2 == 0){                         printf("Korjen\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){                        printf("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);                   break;           case 7:                    system("cls");                   do{                         gotoxy(0,0);                         cout << "> ";  cin >> c;                         system("cls");                         if(c!=-1 && c<i-minus){                             itoa(i++,str,10);                             if(CreateT(str,c,t)){                                  gotoxy(1,1);                                  strcat(error,str);                                  cout << error << endl;                                  strcpy(error,"Greska ");                             }                             nacrtaj(60,2,RootT(t),t);                           }                               }while(c!=-1);                     nacrtaj(60,2,RootT(t),t);                     break;           case 8:                    system("cls");                   ispisi_sve(0,t);                   break;           case 9:                      system("cls");                    nacrtaj(60,2,RootT(t),t);                    gotoxy(0,0); cout <<"B> "; cin >> c;                    minus+=prebroji(c,t);                    DeleteT(c,t);                    system("cls");                    nacrtaj(60,2,RootT(t),t);        } /*switch*/        //printf("\n\n--------------------\n");        system("pause>NUL");    }while(izb!=0);}`