#define velicina 1000
#define NISTA -1
struct grana{
int naziv;
int firstchild;
int nextsibling;
};
struct drvo{
grana id[velicina+1];
int first;
};
struct pomocna{
int naziv;
int x;
};
typedef drvo stablo;
typedef int cvor;
bool goodID(int id){
if(id<=NISTA || id>velicina) return false;
return true;
};
stablo *InitT(pomocna x, stablo *&T){
T = new stablo;
T->first = x.x;
T->id[x.x].naziv = x.naziv;
T->id[x.x].firstchild = NISTA;
T->id[x.x].nextsibling = NISTA;
return T;
};
cvor RootT(stablo *T){
return T->first;
};
cvor FirstChildT(cvor n, stablo *T){
if(!goodID(n) || T->id[n].firstchild<=NISTA)
return NISTA;
return T->id[n].firstchild;
};
cvor NextSiblingT(cvor n, stablo *T){
if(!goodID(n) || T->id[n].nextsibling<=NISTA)
return NISTA;
return T->id[n].nextsibling;
};
int LabelT(cvor n, stablo *T){
if(!goodID(n) || T->id[n].naziv<=NISTA) return NISTA;
return T->id[n].naziv;
};
cvor trazi(cvor n, cvor trazeni, cvor roditelj, stablo *T, cvor &rezultat){
cvor tekuci = FirstChildT(n,T);
while(tekuci>NISTA){
trazi(tekuci,trazeni,n,T,rezultat);
tekuci = NextSiblingT(tekuci,T);
}
if(n==trazeni){
rezultat=roditelj;
return rezultat;
}
};
cvor ParentT(cvor n, stablo *T){
cvor roditelj=NISTA,korijen=RootT(T);
if(goodID(n) && korijen!=n){
trazi(korijen,n,NISTA,T,roditelj);
return roditelj;
}
return NISTA;
};
void CreateT(pomocna x, cvor n, stablo *T){
if(!goodID(n) || !goodID(x.x)) return;
if(FirstChildT(n,T)<=NISTA) T->id[n].firstchild = x.x;
else{
cvor zadnji = FirstChildT(n,T);
while(NextSiblingT(zadnji,T)>NISTA)
zadnji = NextSiblingT(zadnji,T);
T->id[zadnji].nextsibling = x.x;
}
T->id[x.x].naziv = x.naziv;
T->id[x.x].firstchild = NISTA;
T->id[x.x].nextsibling = NISTA;
};
void ChangeLabelT(pomocna x, cvor n, stablo *T){
if(!goodID(n)) return;
T->id[n].naziv = x.naziv;
};
void DeleteT(cvor n, stablo *T){
if(!goodID(n)) return;
static bool obrisan = false;
if(!obrisan) {
cvor roditelj = ParentT(n, T);
if(n!=RootT(T) && roditelj!=NISTA)
if(FirstChildT(roditelj,T)==n)
if(NextSiblingT(roditelj,T)==NISTA)
T->id[roditelj].firstchild=NISTA;
else T->id[roditelj].firstchild=NextSiblingT(n,T);
else{
cvor zadnji = FirstChildT(roditelj,T);
while(NextSiblingT(zadnji,T)!=n)
zadnji = NextSiblingT(zadnji,T);
T->id[zadnji].nextsibling = NextSiblingT(n,T);
}
obrisan = true;
}
if(FirstChildT(n,T)!=NISTA){
DeleteT(FirstChildT(n,T),T);
cvor pom, zadnji = FirstChildT(n,T);
while(NextSiblingT(zadnji,T)!=NISTA){
DeleteT(NextSiblingT(zadnji,T),T);
pom=zadnji;
zadnji = NextSiblingT(zadnji,T);
T->id[pom].nextsibling = NISTA;
}
T->id[n].firstchild = NISTA;
}
obrisan = false;
};