Don't like ads? PRO users don't see any ads ;-)
Guest

Untitled

By: a guest on May 21st, 2012  |  syntax: None  |  size: 2.10 KB  |  hits: 19  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1. static char desen[18][81], cri[] = "xxx";  /* zona reprezentare arbore, info */
  2. static int limita = 17;                    /* linia limita de desenare */
  3.  
  4. void Repr(TArb r, int centru, int linie, int dif)
  5.      /*- functie auxiliara - pregateste desen arbore, cu radacina in centru linie+1
  6.          dif - distanta pe orizontala intre r si fiecare dintre cei doi descendenti
  7.          Exemple:  dif = 5    |        dif = 2    |
  8.                              xxx                 xxx
  9.                           ___/ \___              / \
  10.                          |         |            |   |                               -*/
  11. { int k;
  12.   if (linie > limita) return;
  13.   if (dif <= 1)      /* spatiu de afisare insuficient -> ... */
  14.     { memset(desen[linie]+centru, '.', 3); return; }
  15.   desen[linie][centru] = '|';      /* legatura spre nod */
  16.   desen[linie][0] = ':';
  17.   if (linie+1 > limita) return;
  18.   sprintf(cri, "%3i", r->info);   /* converteste valoare info la 3 caractere */
  19.   k = (cri[0] == ' ') ? 2 : 1;    /* decalaj fata de centru */
  20.   memcpy(desen[linie+1] + centru - k, cri, 3); /* copiaza cele 3 caractere in desen */
  21.   desen[linie+1][0] = ':';
  22.   if (linie+2 > limita) return;
  23.   if (r->st)
  24.   { desen[linie+2][centru-1] = '/';                     /* reprezinta ramura  ____/  */
  25.     desen[linie+2][0] = ':'; desen[linie+3][0] = ':';
  26.     memset(desen[linie+2] + centru - dif + 1, '_', dif-2);
  27.     Repr(r->st, centru - dif, linie + 3, (dif+1)/2 );   /* si subarborele stang */
  28.   }
  29.   if (r->dr)
  30.   { desen[linie + 2][centru+1] = '\\';                  /* reprezinta ramura  \____  */
  31.     desen[linie+2][0] = ':'; desen[linie+3][0] = ':';
  32.     memset (desen[linie+2] + centru + 2, '_', dif-2);
  33.     Repr(r->dr, centru + dif, linie + 3, (dif+1)/2 );   /* si subarborele drept */
  34.   }
  35. }
  36.  
  37. void AfiArb(TArb r) /*- afiseaza arborele r -*/
  38. { int j;
  39.   for (j = 0; j <= limita; j++) memset (desen[j], ' ', 79);
  40.   if (!r) printf ("%49s", "-=- Arbore VID -=-");
  41.   else
  42.   { Repr(r,40,0,19); /* pregateste reprezentare cu centrul in coloana 39 a primei linii */
  43.     for (j = 0; j <= limita && desen[j][0] == ':'; j++)
  44.      { desen[j][79] = '\0'; printf("%s\n", desen[j]+1); }
  45.   }
  46.   printf ("\n");
  47. }