Newsgroup: it.comp.lang.c
Titolo: alberi ed inserimento

Ho implementato una semplice funzione di inserimento in un albero di ricerca
ma mi da errore quando faccio l'assegnamento:
ultimo=ultimo->destra
Ecco il testo:
void riempi_nodo(TipoAlbero *alb,TipoElemAlbero num){
 TipoAlbero paux,ultimo;
 /*creo nuovo nodo albero*/
 paux=malloc(sizeof(TipoNodoAlbero));
 paux->destra=NULL;
 paux->sinistra=NULL;
 paux->numero=num;
 /*non si sono nodi allora riempio la radice*/
 if (*alb==NULL)
  (*alb)=paux;
  /* la radice c'è già allora cerco il posto giusto scorrendo i nodi*/
 else {
  /*uso ultimo per scorrere l'albero*/
  ultimo=*alb;
  while (ultimo!=NULL) {
   if (num<(ultimo->numero))
    ultimo=ultimo->destra;
   else
    ultimo=ultimo->destra;
  }
  ultimo=paux;
 }
}
E le dichiarazioni sono :
typedef short int TipoElemAlbero;
struct StructAlbero {
 TipoElemAlbero numero;
 struct StructAlbero *sinistra;
 struct StructAlbero *destra;
};
typedef struct StructAlbero TipoNodoAlbero;
typedef TipoNodoAlbero *TipoAlbero;

Ma che è il D&D?
Cmq mi pare che tu non faccia l'assegnamento per riferimento, per tanto
l'operatore freccia va sostituito con l'operatore punto.
Spiego meglio:
se tu dichiarassi la variabile paux
*paux=malloc(sizeof(TipoNodoAlbero));
otterresti un puntatore alla locazione di memoria per deriferimento
(operatore *) e quindi l'assegnazione
ultimo=ultimo->destra;
sarebbe corretta
dato invece che tu inizializzi la variabile direttamente, per ottenere i
membri del nodo devi usare l'operatore punto
utlimo=ultimo.destra;
Insomma prova a sotituire la "->" col "." e vedi che succede :D
Spero di aver detto giusto, in fondo non sono un professionista :p
Ciao
Claudio

   }
 --
Iscriviti al gruppo yahoo Linguaggio_C  con chat vocale per i soli iscritti
http://it.groups.yahoo.com/group/Linguaggio_C

 ha scritto nel messaggio
news:TLzx8.5293$W9.1...@twister2.libero.it...


Ti invio la funzione che inserisce nodi in un albero cosě come č scritta nel
D&D; per me č stato molto utile studiarla... spero lo possa essere anche per
te.
Ciao ciao
void insertNode(TREENODEPTR *treePtr, int value)
{
   if (*treePtr == NULL) {   /* *treePtr is NULL */
      *treePtr = malloc(sizeof(TREENODE));
      if (*treePtr != NULL) {
         (*treePtr)->data = value;
         (*treePtr)->leftPtr = NULL;
         (*treePtr)->rightPtr = NULL;
      }
      else
         printf("%d not inserted. No memory available.\n",
                value);
   }
   else
      if (value < (*treePtr)->data)
         insertNode(&((*treePtr)->leftPtr), value);
      else
         if (value > (*treePtr)->data)
            insertNode(&((*treePtr)->rightPtr), value);
         else
            printf("dup");
}

 te.
Se vi può servire, questa è un'altra implementazione della stessa funzione,
forse un po' più semplice...
struct albero *insert (struct albero *t, int n)
                {
                            if (t==NULL)
                                    {
                                               t=malloc(sizeof(struct
albero));
                                               t->val=n;
                                               t->left=NULL;
                                               t->right=NULL;
                                               return t;
                                     }
                            else if (t->val == n)
                                                return t;
                            else if (t->val > n)
                                    {
                                                t->left=insert(t->left, n);
                                                return t;
                                     }
                            else if (t->val < n)
                                     {
                                                t->right=insert(t->right,
n);
                                                return t;
                                     }
                }
Marco