Newsgroup: it.comp.lang.c
Titolo: Precisazione!!

Per visita per livelli intendevo un algoritmo che mi desse come output su
schermo il disegno dell'albero, cioč in formato teso, su ogni riga le foglie
del corrispondente livello dell'albero:
es:
1 riga                Radice
2 riga    sott_sx           sott_dx
3 riga .....    e cosě via!!!!
Grazie intanto Skyscraper per l'algoritmo del  calcolo delle foglie!!!!!!

3 riga .....    e cosl via!!!!
Il tutto e' riferito alla mia macchina, in ambiente MS-DOS (80x25 righe).
E' solo un esempio che puoi modificare a tuo piacimento.
A dire il vero, per le piccole dimensioni del video, non e' conveniente
visualizzare l'albero a video.
Di maggiore interesse e' invece l'array di liste di elementi presenti per ogni
livello.
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
typedef struct foglia {
	       int num ;
	       struct foglia * sotto_albero_sinistro;
	       struct foglia * sotto_albero_destro;
	       } * ptr_foglia;
typedef struct nodo {
                      int num ;
                      struct nodo * prossimo ;
                    } * ptr_nodo ;
void inserisci_in_lista ( int num, ptr_nodo * radice )
{
     ptr_nodo nodo_temp ;
     nodo_temp = (ptr_nodo) malloc ( sizeof( struct nodo ) ) ;
     nodo_temp->prossimo = NULL ;
     nodo_temp->num = num ;
     if (*radice == NULL)
        *radice = nodo_temp ;
     else
        inserisci_in_lista( num, &(*radice)->prossimo ) ;
}
void inserisci_numero( int num, ptr_foglia * radice )
{
     ptr_foglia  nodo_temp ;
     nodo_temp = (ptr_foglia) malloc( sizeof( struct foglia ) );
     nodo_temp->num = num;
     nodo_temp->sotto_albero_sinistro = NULL;
     nodo_temp->sotto_albero_destro = NULL;
     if (*radice == NULL)
	*radice = nodo_temp;
     else
     if (num <= (*radice)->num)
	inserisci_numero( num, &(*radice)->sotto_albero_sinistro );
     else
	inserisci_numero( num, &(*radice)->sotto_albero_destro );
}
void scrivi_albero ( ptr_foglia radice, ptr_nodo radice_lista[],
                     unsigned x, unsigned y, unsigned w, unsigned l)
{
    gotoxy ( x, y ) ; printf ( " %2d ", radice->num ) ;
    inserisci_in_lista ( radice->num, &radice_lista[l-1] ) ;
    if ( radice->sotto_albero_sinistro )
       scrivi_albero( radice->sotto_albero_sinistro,
                      radice_lista,
                      x - w/2 , y + 1, w/2, l+1 ) ;
    if ( radice->sotto_albero_destro )
       scrivi_albero( radice->sotto_albero_destro,
                      radice_lista,
                      x + w/2, y + 1, w/2, l+1 ) ;
}
void scrivi_liste ( ptr_nodo radice_lista[] )
{
     int i ;
     ptr_nodo cursore ;
     for (i = 0 ; i < 10 ; i++ )
         if ( radice_lista[i] )
         {
            printf("(%2d) ", i+1 );
            cursore = radice_lista[i] ;
            while ( cursore )
            {
                  printf("%2d ; ", cursore->num );
                  cursore = cursore->prossimo ;
            }
            printf("\n");
         }
}
int main( void )
{
    ptr_foglia radice_albero = NULL ;
    ptr_nodo   radici_liste[10] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } ;
    char line[80] ;
    int i ;
    memset(line, '-', 75) ; line[75] = 0 ;
    inserisci_numero( 10, &radice_albero );
    inserisci_numero( 5, &radice_albero );
    inserisci_numero( 15, &radice_albero );
    inserisci_numero( 2, &radice_albero );
    inserisci_numero( 1, &radice_albero );
    inserisci_numero( 3, &radice_albero );
    inserisci_numero( 13, &radice_albero );
    inserisci_numero( 7, &radice_albero );
    inserisci_numero( 14, &radice_albero );
    inserisci_numero( 6, &radice_albero );
    inserisci_numero( 8, &radice_albero );
    inserisci_numero( 20, &radice_albero );
    inserisci_numero( 30, &radice_albero );
    inserisci_numero( 19, &radice_albero );
    inserisci_numero( 12, &radice_albero );
    inserisci_numero( 25, &radice_albero );
    clrscr() ;
    puts("disegno albero :\n");
    for (i = 1; i <= 6; i++) printf("(%2d)%s\n", i, line);
    scrivi_albero ( radice_albero, radici_liste, 40, 3, 40, 1 ) ;
    gotoxy(1, 10);
    puts("elenco livelli e relativi nodi :\n");
    scrivi_liste( radici_liste ) ;
    return 0;
}
Skyscraper (apprezzatelo adesso : eviterete la coda)
----------------------------------------------------
 
andrea_...@bigfoot.com
----------------------------------------------------
--
Posted from 
itaca.ulysse.it
 [195.223.254.1]
via Mailgate.ORG Server - 
http://www.mailgate.org

grazie mille, mi sei stato davvero di grandissimo aiuto,
grazie mille e a risentirci!!!!
        Marc

}
correzione in :
void inserisci_numero( int num, ptr_foglia * radice )
{
     ptr_foglia  nodo_temp ;
     if (*radice == NULL)
     {
        nodo_temp = (ptr_foglia) malloc( sizeof( struct foglia ) );
        nodo_temp->num = num;
        nodo_temp->sotto_albero_sinistro = NULL;
        nodo_temp->sotto_albero_destro = NULL;
	*radice = nodo_temp;
     }
     else
     if (num <= (*radice)->num)
	inserisci_numero( num, &(*radice)->sotto_albero_sinistro );
     else
	inserisci_numero( num, &(*radice)->sotto_albero_destro );
}
