Newsgroup: it.comp.lang.c
Titolo: ALBERI BINARI AIUTO!!

mi servirebbe un piccolo aiuto...
come far funzionare questo programma [albero binario di ricerca con
inserimento di X valori] e come implementare una semplice funzione di
ricerca dato un valore numerico..grazie in anticipo a tutti...
questo è il codice:
#include <stdio.h>
#include <stdlib.h>
typedef struct nodo
    {
    int key;
    struct  nodo  *left,  *right;
    }NODO;
void insert(NODO **ptr,  int  g)
{
/* la radice esiste */
if(*ptr)
    insert(((*ptr)->key>g)?(&(*ptr)->left):(&(*ptr)->right),g);
else
/* la radice non esiste,  viene creata l'albero*/
    {
    *ptr=(NODO *)malloc(sizeof(NODO));
    (*ptr)->key=g;
    (*ptr)->left=(*ptr)->right=NULL;
    }
cancella(&tree);
}
void stampalbero(NODO *ptr)
{
 /* caso albero vuoto */
 if(ptr==NULL)
 {
  printf("albero vuoto ");
  return;
 }
    /* stampa dell'albero ordinato */
    if(ptr->left!=NULL)stampalbero(ptr->left);
    printf("%d ",ptr->key);
    if(ptr->right!=NULL)stampalbero(ptr->right);
}
void cancella(NODO **ptr)
	{
 	if(*ptr!=NULL){
	  cancella(&(*ptr)->left);
	  free(*ptr);
	  *ptr=NULL;
	}
}
main()
{
/* dichiarazioni */
int x, i=0, temp;
NODO *tree;
NODO *tree=NULL;
printf("Digita il numero dei valori da inserire: ");
scanf("%d", &temp);
printf("inserisci %d valori: \n", temp);
while( i<temp)
   {
    scanf("%d", &x);
    insert(&tree, x);
    i++;
    } stampalbero(tree);
}
grazie ancora 
Riccardo



Ho corretto i tuoi errori; ti allego il codice funzionante.
Ho tolto la funzione "cancella", perché così come l'hai scritta tu
non ha molta utilità. Buon lavoro
<CODE>
#include <stdio.h>
#include <stdlib.h>
struct nodo {
  int key;
  struct  nodo  *left,  *right;
};
typedef struct nodo NODO;
typedef NODO *NODOPTR;
void insert(NODOPTR *, int);
void stampaAlbero(NODOPTR);
main()
{
  int x, temp;
  NODOPTR tree = NULL;
  printf("Digita il numero dei valori da inserire: ");
  scanf("%d", &temp);
  printf("inserisci %d valori: \n", temp);
  for ( ; temp > 0; temp--) {
    scanf("%d", &x);
    insert(&tree, x);
  }
  stampaAlbero(tree);
  printf("\n");
}
void insert(NODOPTR *ptr, int  g) {
  if(*ptr) {   /* la radice esiste */
    if ((*ptr)->key > g)
      insert(&((*ptr)->left), g);
    else
      insert(&((*ptr)->right), g);
  } else {    /* la radice non esiste,  viene creato l'albero*/
    *ptr = malloc(sizeof(NODO));
    (*ptr)->key = g;
    (*ptr)->left = (*ptr)->right = NULL;
  }
}
/* stampa l'albero in pre-order */
void stampaAlbero(NODOPTR ptr) {
  if(ptr != NULL) {
    printf("%d ",ptr->key);
    stampaAlbero(ptr->left);
	stampaAlbero(ptr->right);
  }
}
</CODE>
-- 
Ciao, Giuseppe

grazie 1000..ma la funziona di ricerca? ;)
riccardo

grazie 1000..ma la funziona di ricerca? ;)
non mi era chiaro quale doveva essere lo scopo della tua funzione di
ricerca. Cioč: una volta trovato il nodo, cosa deve restituire?
oppure deve cancellare il nodo? o cos'altro?
Se puoi essere piů chiaro ti scrivo anche questa funzione.
-- 
Ciao, Giuseppe


dato un valore X, la funzione controlla se il valore stesso č presente 
nell'albero, e scrive [tanto x fare un esempio]:
"si c'č, č la radice / č al livello XXX"
"no, non c'č"
e che dopo dica
"cercare altro valore S/N?"
grazie e scusa il ritardo, l'estate fa brutti scherzi ;))
Rik

 "cercare altro valore S/N?"
Beh, questo te lo lascio come esercizio ;)
ciao
Kronos
-- 
Home: 
http://kronoz.cjb.net
Not an editor command: Wq