Newsgroup: it.comp.lang.c
Titolo: Albero binario

Sto cercando di realizzare un albero binario e il codice è il seguente:
struct btree {
              int val;
              struct btree *Lson;
              struct btree *Rson;
             } ;
struct btree *Node;
struct btree *newtree()
{
 return (NULL);
}
int empty(struct btree *Node)
{
 return (Node==NULL);
}
void insert(struct btree *Node, int n)
{
  struct btree *Ptr;
 if(empty(Node))
     {
      Ptr=(struct btree*)malloc(sizeof(struct btree));
      Ptr->val=n;
      Ptr->Lson=NULL;
      Ptr->Rson=NULL;
      Node=Ptr;
     }
 else{
      if (Node->val>n){ insert(Node->Lson, n);}
      else{if(Node->val<n){insert(Node->Rson, n);}}
     }
void main()
{int n, choice;
 Node=(struct btree*)malloc(sizeof(struct btree));
 Node=newtree();
do{printf("\nImmetti il valore da inserire\n"); scanf("%d", &n);
                      insert(Node, n);
}while(n!=-1);
}
Se vado a fare una visita all'albero ( con una procedura che sono sicuro sia
corretta), mi dice che l'albero è vuoto.Perchè?
Qualcuno potrebbe gentilmente aiutarmi.
Grazie anticipatamente

 ha scritto nel messaggio
news:uVqM6.4978$pa3.6...@news.infostrada.it...

Ci sono alcuni errori.
Innanzitutto la funzione insert dovrebbe essere dichiarata così
void insert(struct btree **Node, int n);
altrimenti i  Node nn viene modificati all'uscita dalla funzione insert.
Quindi anderebbe riscritta così :
void insert(struct btree **Node, int n)
{
  if(empty(*Node))
      {
       struct btree *Ptr;
       Ptr=malloc(sizeof(struct btree));
       Ptr->val=n;
       Ptr->Lson=NULL;
       Ptr->Rson=NULL;
       *Node=Ptr;
      }
  else{
       if ((*Node)->val>=n){ insert(&(*Node)->Lson, n);}
       else {insert(&(*Node)->Rson, n);}}
     }
}
poi nel main
int main()
{
{int n, choice;
  Node=malloc(sizeof(struct btree));
^^^^^^^^^^^^^^^^^^^^^^^^^^^ togli la lionea sopra , nn ha senso allocare la
variabile Node e poi farla punatare a NULL.
  Node=newtree();
 do{printf("\nImmetti il valore da inserire\n"); scanf("%d", &n);
                       insert(&Node, n);
 }while(n!=-1);    //così però viene inserito sempre anche -1 nell'albero,nn
credo fosse tua intenzione.Meglio while(
 }
Inoltre nn vedo perchè avresti dovuto dichiarare Node come gloabale.
In C non dovresti usare nell'allocazione di puntatori con la malloc la
sintassi   pt = (type*)malloc(...);
ma solo pt = malloc(...);
Altra cosa nella funzione insert ti eri dimenticato di considerare il caso
in cui (*Node)->val ==  n.
Ciao Alberto.
}

Se ti servono nel mio misero sito (sez informatics) puoi trovare
delle implementazioni sugli alberi binari e svariate funzioni...
 byez
 NIck
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
URL :       
http://www.Geocities.com/nick_hideout/
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
Ne pas aimer c'est un long mourir.
[Wu Ti]

Sto cercando di realizzare un albero binario e il codice è il seguente:
Ti riscrivo il codice, bada che vado al volo senza aver compilato,
quindi attento agli eventuali errori.
#include <stdlib.h>  /* per malloc() */
typedef struct _nodo { 
               int dato ;
               struct _nodo *sx ;
               struct _nodo *dx ;
        } nodo, *pnodo ;
void inserisci( pnodo *p, int dato )
{
     if ( *p == NULL ) 
     {
        *p = malloc( sizeof **p ) ;
        (*p)->sx = (*p)->dx = NULL ;
        (*p)->dato = dato ;
     }
     else
     if ( dato <= (*p)->dato ) inserisci( &(*p)->sx, dato ) ;
     else
     if ( dato > (*p)->dato ) inserisci( &(*p)->dx, dato ) ;
}
int main()
{
    *pnodo radice = NULL ;
 
    inserisci( &radice, 7 ) ;
    inserisci( &radice, 3 ) ;
    inserisci( &radice, 4 ) ;
    inserisci( &radice, 2 ) ;
    inserisci( &radice, 8 ) ;    
}
--
Walkie...@Libero.It (ICQ# 8143647)