Nouvelle version

que je n'ai toujours pas testé
////////////////////////// © Raoul PRÉVOST (Thepro). //////////////////////////
typedef struct {char *texte;int nbenfants,hauteur;void *parent,**enfants;} noeud;
int dec=5; //Largeur maximale des textes des noeuds (utile seulement avec la ligne (1)).
void printXY(int x,int y,char *texte)
{
printf("\33[u;%dB;%dC%s",y,x,texte);
}
int InitHauteur(noeud *courant)
{
int i,nb=0;
if (!courant->nbenfants) nb=2;
for (i=0;i<courant->nbenfants;i++)
nb+=InitHauteur(courant->enfants[i]);
nb+=courant->nbenfants-1;
courant->hauteur=nb;
return nb;
}
void DessineNoeud(noeud courant,short x,short y)
{
int i,ycourant=y+(courant.hauteur-1)/2;
printXY(x-1,ycourant,(char*)"+");
printXY(x,ycourant,courant.texte);
if (!courant.nbenfants) return;
//////////////////// Ne garder que l'une de ces 2 lignes ! ////////////////////
x+=dec;// (1)
x+=strlen(courant.texte);// (2)
///////////////////////////////////////////////////////////////////////////////
//////////////////////////// Affichage des lignes. ////////////////////////////
for (i=(((noeud*)courant.enfants[0])->hauteur-1)/2;i<courant.hauteur-((noeud*)courant.enfants[courant.nbenfants-1])->hauteur/2;i++)
printXY(x,y+i,(char*)"|");
printXY(x,ycourant,(char*)"+");
//////////////////////// Affichage des noeuds enfants. ////////////////////////
for (i=0;i<courant.nbenfants;i++)
DessineNoeud(*(noeud*)(courant.enfants[i]),x+1,y),
y+=((noeud*)(courant.enfants[i]))->hauteur+1;
}
void DessineArbre(noeud *racine)
{
printf("\33[s");
InitHauteur(racine);
DessineNoeud(*racine,1,0);
}
void main(void)
{
noeud racine;
(...)
DessineArbre(&racine);
(...)
}