/ Published in: C++
Expand |
Embed | Plain Text
// bstablo_polje.h typedef int labeltype; struct element { labeltype label; int used; }; struct bt { element elements[10000]; }; typedef bt *btree; typedef int node; node ParentB( int n, btree T) { if (n==1) { return 0; }//if return n/2; }; node LeftChildB(int n, btree T) { if(T->elements[n*2].used==0) { return -1; }//if else return n*2; }; node RightChildB(int n,btree T) { if(T->elements[(n*2)+1].used==0) return -1; else return n*2+1; }; node LabelB(int n, btree T) { if(T->elements[1].used == 0 || n<0) return 0; return T->elements[n].label; }; node ChangeLabelB(int x,int n,btree T) { T->elements[n].used=1; T->elements[n].label=x; }; node RootB(btree T) { return 1; }; void CreateLeftB(int x,int n, btree T) { if(n*2>10000) return; if(T->elements[n*2].used==1) return; else { T->elements[n*2].label=x; T->elements[n*2].used=1; }//else }; void CreateRightB(int x, int n, btree T) { if(n*2+1>10000) return; if(T->elements[n*2+1].used==1) return; else { T->elements[n*2+1].label=x; T->elements[n*2+1].used=1; }//else }; void DeleteB( int n, btree T) { T->elements[n].used=0; if(LeftChildB(n,T)!=-1) { DeleteB(LeftChildB(n,T),T); }//if if(RightChildB(n,T)!=-1) { DeleteB(RightChildB(n,T),T); }//if }; btree InitB(int n, btree T) { if(T) delete T; T = new bt; T->elements[1].label = n; T->elements[1].used=1; T->elements[0].used=1; for(int i=2;i<10000;i++) T->elements[i].used=0; return T; }; /////////////////////////// // bstablo_pokazivac.h typedef int labeltype; struct element { labeltype label; element *left, *right; }; typedef element *node; typedef element *btree; node ParentB(node n, btree T) { if(n == T) return NULL; node P = NULL; if(T->left!=NULL) { if(T->left == n) return T; else P = ParentB(n,T->left); }//if if(T->right!=NULL) { if(T->right == n) return T; else P = ParentB(n,T->right); }//if return P; }; node LeftChildB(node n, btree T) { if(n!=NULL || n -> left != NULL) return n -> left; else NULL; }; node RightChildB(node n, btree T) { if(n!=NULL || n -> right != NULL) return n -> right; else NULL; }; labeltype LabelB(node n, btree T) { return n->label; }; void ChangeLabelB(int x, node n, btree T) { if(n==NULL)return; n->label = x; }; node RootB(btree T) { if(T!=NULL) return T; else return NULL; }; void CreateLeftB(int x, node n, btree T) { if(n->left!=NULL) return; node novi = new element; n->left= novi; novi->label = x; novi->left=NULL; novi->right=NULL; }; void CreateRightB(int x, node n, btree T) { if(n->right!=NULL) return; node novi = new element; n->right = novi; novi->label = x; novi->left=NULL; novi->right=NULL; }; void DeleteB(node n, btree T) { if(n->left!=NULL) DeleteB(n->left,T); if(n->right!=NULL) DeleteB(n->right,T); delete n; }; btree InitB(int n, btree T) { if(T) delete T; T = new element; T->label= n; T->right =NULL; T->left = NULL; return T; }; /////////////////////////// // Main.cpp #include<iostream> using namespace std; #include "bstablo_polje.h" //#include "bstablo_pokazivac.h" int main() { btree T; int izbor,unos; bool upis=false,upis2=false; do{ cout<<"---------------------------------"<<endl <<"0. Iniciranje binarnog stabla <InitB>"<<endl <<"1. Dodavanje desnog i ljevog djeteta korjenu stabla <CreateLeftB, \n CreateRightB>"<<endl <<"2. Izmjena ljevog i desnog djeteta <ChangeLabelB>"<<endl <<"3. Dodavanje desnog djeteta ljevom i desnom djetetu cvora <CreateLeftB,\n CreateRightB>"<<endl <<"4. Prikaz roditelja cvora <ParentB, LabelB>"<<endl <<"5. Brisanje cvora <DeleteB>"<<endl <<"9. Kraj"<<endl <<"---------------------------------"<<endl; cin>>izbor; switch(izbor) { case 0: cout<<"Korjen = "; cin>>unos; T=InitB(unos,T); cout<<"\t\t\t"<<LabelB(RootB(T),T)<<endl; break; case 1: upis=true; cout<<"n_right= "; cin>>unos; CreateRightB(unos,RootB(T),T); cout<<"n_left= "; cin>>unos; CreateLeftB(unos,RootB(T),T); cout<<"\t\t\t"<<LabelB(RootB(T),T)<<endl <<"\t\t "<<LabelB(LeftChildB(RootB(T),T),T)<<"\t "<<LabelB(RightChildB(RootB(T),T),T)<<endl; cout<<endl; break; case 2: if (upis==false){ cout<<"Prvo koirstite migucnost 1...."<<endl; break; } cout<<"n_right= "; cin>>unos; ChangeLabelB(unos,RightChildB(RootB(T),T),T); cout<<"n_left= "; cin>>unos; ChangeLabelB(unos,LeftChildB(RootB(T),T),T); cout<<"\t\t\t"<<LabelB(RootB(T),T)<<endl; cout<<"\t\t "<<LabelB(LeftChildB(RootB(T),T),T)<<"\t "<<LabelB(RightChildB(RootB(T),T),T)<<endl; cout<<endl; break; case 3: if (upis==false){ cout<<"Prvo koirstite migucnost 1...."<<endl; break; } cout<<"n_right= "; cin>>unos; CreateRightB(unos,LeftChildB(RootB(T),T),T); cout<<"\t\t\t"<<LabelB(RootB(T),T)<<endl; cout<<"\t\t "<<LabelB(LeftChildB(RootB(T),T),T)<<"\t "<<LabelB(RightChildB(RootB(T),T),T)<<endl; cout<<"\t\t "<<LabelB(RightChildB(LeftChildB(RootB(T),T),T),T)<<endl; cout<<endl; cout<<"n_right= "; cin>>unos; CreateRightB(unos,RightChildB(RootB(T),T),T); cout<<"\t\t\t"<<LabelB(RootB(T),T)<<endl; cout<<"\t\t "<<LabelB(LeftChildB(RootB(T),T),T)<<"\t "<<LabelB(RightChildB(RootB(T),T),T)<<endl; cout<<"\t\t "<<LabelB(RightChildB(LeftChildB(RootB(T),T),T),T)<<"\t "<<LabelB(RightChildB(RightChildB(RootB(T),T),T),T)<<endl; cout<<endl; upis2=true; break; case 4: cout<<"Roditelj broja "<<LabelB(LeftChildB(RootB(T),T),T)<<" je: "<<LabelB(ParentB(LeftChildB(RootB(T),T),T),T)<<endl; if(upis2==true){ cout<<"Roditelj broja "<<LabelB(RightChildB(RightChildB(RootB(T),T),T),T)<<" je: "<<LabelB(ParentB(RightChildB(RightChildB(RootB(T),T),T),T),T)<<endl; } break; case 5: DeleteB(LeftChildB(RootB(T),T),T); cout<<"\t\t\t"<<LabelB(RootB(T),T)<<endl; cout<<"\t\t "<<"\t "<<LabelB(RightChildB(RootB(T),T),T)<<endl; cout<<"\t\t "<<"\t "<<LabelB(RightChildB(RightChildB(RootB(T),T),T),T)<<endl; cout<<endl; break; }//switch }while(izbor!=9); system("pause"); return 0; };
You need to login to post a comment.
