Revision: 38692
Initial Code
Initial URL
Initial Description
Initial Title
Initial Tags
Initial Language
at January 6, 2011 06:55 by mazorkovi
Initial Code
#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 2
typedef int labeltype;
#include "bstablo_pokazivac.h"
#include "bstablo_polje.h"
#include "ostablo.h"
using namespace std;
#ifdef BSTABLO_POLJE_H
void 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);
}
Initial URL
Initial Description
Initial Title
Z4 Glavni program
Initial Tags
Initial Language
C++