Ricerca elemento all'interno di un albero binario[C]

fk16
Ragazzi come da titolo voglio creare una funzione che mi ricerca se l'elemento è all'interno di un albero binario. L'esercizio richiede che in caso affermativo, la funzione mi deve restituire un puntaore al nodo, altrimenti deve restitutire un puntatore a NULL.
Posto il main e la funzione interessata.
int main(){
   ALBERO padre,punt_nodo;
   int size;
   double *vet,val_nodo;
   printf("Di quanti elementi deve essere l'albero?\n");
   scanf("%d",&size); 
   vet=(double*)calloc(size,sizeof(double));
   crea_vet(vet,size);                            
   padre=crea(vet,0,size);
   printf("Quale elemento vuoi cercare?\n");
   scanf("%lf",&val_nodo);
   punt_nodo=ricerca(padre,val_nodo);
   if(punt_nodo!=NULL)
      printf("Il numero e' presente\n");
   else
      printf("Il numero non e' presente\n");   
   system("pause");
   return;
}

ALBERO ricerca(ALBERO p,double val_nodo){
       ALBERO temp;
       temp=p;
       if(temp==NULL)
          return NULL;
       else{
         if(val_nodo==temp->val)
            return temp;
          else{
             ricerca(temp->sx,val_nodo);
             ricerca(temp->dx,val_nodo);
             }}}      

Cosa sbaglio???
Il compilatore mi dice sempre che il valore non è contenuto, perchè???
Grazie per l'eventuale aiuto.

Risposte
fk16
nessuno mi sa aiutare???

apatriarca
Il codice che hai postato non è molto.. Ma la prima cosa che salta all'occhio è la mancanza di un return nel ramo nel blocco:
ricerca(temp->sx,val_nodo);
ricerca(temp->dx,val_nodo);

Mi stupisce in effetti che il programma venga effettivamente compilato.

fk16
innanzi tutto grazie della risposta. Comunque non penso sia quello il problema perchè il programma dovrbbe andare avanti fino a che non trova il valore per poi uscire. Ti dico questo pure perchè ho fatto molti altri programmi in questo modo e mi soon venuti.....noti comunque qualche altra cosa di strano nel codice???

apatriarca
Il fatto che tu l'abbia fatto in altri programmi non significa che sia corretto. Anzi, se una funzione restituisce qualcosa, deve SEMPRE restituire qualcosa. Per cui è sbagliato indipendentemente se sia o meno l'errore che impedisce il funzionamento della tua funzione. Ma è l'errore che stai cercando perché non propaghi il valore di ritorno indietro nella ricorsione. Il codice dovrebbe in realtà essere qualcosa come:
ALBERO ret = ricerca(temp->sx,val_nodo);
if (NULL == ret) {
    ret = ricerca(temp->dx,val_nodo);
}
return ret;

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.