13Fermer15
RHJPPLe 10/08/2005 à 12:17
Nouvelle version wink que je n'ai toujours pas testé grin ////////////////////////// © 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);      (...) }