You are on page 1of 6

#include <stdio.

h>
#include <stdlib.h>
typedef struct arbore
{
char cheie;
int parinte;
}arbore;
arbore *a=NULL;
void generare_arbor(int *n)
{
int i,j,inexistent;
do{
printf("Specificati numarul de noduri(dimensiune arbore): ");
scanf("%d",&(*n));
}while(*n<=0);
a=malloc((*n)*sizeof(arbore));
a[0].parinte=-1;
printf("Introduceti cheia radacinii: ");
fflush(stdin);
a[0].cheie=fgetc(stdin);
for(i=1;i<(*n);i++)
{
printf("Introduceti cheia nodului %d: ",i);
fflush(stdin);
a[i].cheie=fgetc(stdin);
do{
inexistent=1;
printf("Introduceti parintele nodului %c (%d): ",a[i].cheie,i);
scanf("%d",&a[i].parinte);
for(j=0;j<=i;j++)
{
if(a[i].parinte==a[j].parinte)
{
inexistent=0;
j=i;
}
}
if(inexistent)
printf("EROARE!Parinte inexistent!\n");
}while(inexistent);
}
}
void afisare_tabel(int n)
{
int i;
printf("\n\n+--------+-------+---------+\n");
printf("| Indice | Cheie | Parinte |\n");
printf("+--------+-------+---------+\n");
for(i=0;i<n;i++)

{
printf("| %4d | %-3c |
%-3d |\n",i,a[i].cheie,a[i].parinte);
}
printf("+--------+-------+---------+\n\n");
}
void sortare(int n)
{
arbore aux;
int i,j=1,done;
do{
done=1;
for(i=0;i<n-j;i++)
{
if(a[i].parinte>a[i+1].parinte)
{
aux=a[i];
a[i]=a[i+1];
a[i+1]=aux;
done=0;
}
}
}while(!done);
}
void insereaza_radacina( char cheie_radacina ) //distruge arborele generalizat d
aca acesta exista si creeaza unul nou avand "cheie_radacina" pe post de radacina
;
{
int n;
do{
printf("Specificati numarul de noduri(dimensiune arbore): ");
scanf("%d",&n);
}while(n<=0);
a=malloc(n*sizeof(arbore));
a[0].parinte=-1;
a[0].cheie=cheie_radacina;
return n;
}
void insereaza_cheie( char cheie, int parinte, int *n)
{
a=realloc(a,((*n)+1)*sizeof(arbore));
a[*n].cheie=cheie;
a[*n].parinte=parinte;
(*n)++;
sortare(n);
}
int cauta_cheie(char cheie,int n)
{
int i;
for(i=0;i<n;i++)
{

if(a[i].cheie==cheie){
return 1;
}
}
return 0;
}
int sterge_cheie(char cheie,int *n){
int i,j,deleted=0;
for(i=0;i<(*n);i++){
if(a[i].cheie==cheie)
{
for(j=i;j<(*n)-1;j++)
{
a[j]=a[j+1];
i=(*n);
deleted=1;
}
}
}
(*n)--;
if(deleted){
return 1;
}else
{
return 0;
}
}
void sterge_subarbore(char cheie,int *n)
{
int i,p,flag=0;
for(i=0;i<(*n);i++)
if(a[i].cheie==cheie)
p=a[i].parinte;
for(i;i<n;i++)
{
if(a[i].parinte==p)
{
a[i].cheie='-';
flag=1;
}
if(a[i].parinte!=p&&flag)
{
flag=0;
i--;
p=i;
}
}
flag=0;
do{
flag=sterge_cheie('-',*n);
}while(flag);
}
int inaltime_arbore(int n)

{
int i,h=0;
for(i=n;i>0;i--)
{
i=a[i].parinte;
h++;
}
return h;
}
int grad_arbore(int n)
{
int i,max=0,j=1;
for(i=0;i<n;i++)
{
if(a[i].parinte==a[i+1].parinte)
j++;
else if (j>max)
{
max=j;
j=0;
}
}
return (max+1);
}
int cel_mai_din_stanga_frate(char cheie,int n)
{
int i,j,stanga;
for(i=0;i<n;i++)
{
if(a[i].cheie==cheie)
{
j=i;
i=n;
}
}
stanga=i;
for(i=j;i>=1;i--)
{
if(a[i].parinte==a[i-1].parinte)
stanga=i;
}
return stanga;
}
int cel_mai_din_dreapta_frate(char cheie,int n)
{
int i,j,dreapta;
for(i=0;i<n;i++)
{
if(a[i].cheie==cheie)
{

j=i;
i=n;
}
}
dreapta=i;
for(i=j;i<n-1;i++)
{
if(a[i].parinte==a[i+1].parinte)
dreapta=i;
}
return dreapta;
}
int numar_frati(char cheie,int n)
{
int i,j,f=0;
for(i=0;i<n;i++)
{
if(a[i].cheie==cheie)
{
j=i;
i=n;
}
}
for(j;j<n-1;j++)
{
if(a[j].parinte==a[j+1].parinte)
f++;
}
return f;
}
int main()
{
int n;
char c;
generare_arbor(&n);
sortare(n);
afisare_tabel(n);
printf("Arborele are gradul %d.\n",grad_arbore(n));
printf("Ce cheie doriti sa cautati? ");
fflush(stdin);
c=fgetc(stdin);
if(cauta_cheie(c,n))
printf("Cheia cautata a fost gasita!\n");
else
printf("Cheie inexistenta.\n");
printf("Ce cheie doriti sa stergeti? ");
fflush(stdin);
c=fgetc(stdin);
sterge_cheie(c,&n);
afisare_tabel(n);

return 0;
}

You might also like