Costruire albero binario [C]
Ragazzi ho un problema che non riesco a risolvere. Vorrei creare una funzione che mi costruisce un albero binario. Questo è quello che ho fatto:
Sicuramente c'è qualche problema nelle funzione costruisci_albero. Voi capite dove è l'errore??? perchè io non riesco a trovarlo.
grazie a tutti per l'eventuale aiuto.
Ciao.
#include<stdio.h> #include<stdlib.h> #include<time.h> typedef struct nodo{ double val; struct nodo *sx; struct nodo *dx; }NODO; typedef NODO *ALBERO; ALBERO costruisci_albero(ALBERO,int); void visita(ALBERO); int main(){ ALBERO p; int n,i; printf("Quanti elementi devono essere inseriti?\n"); scanf("%d",&n); p=costruisci_albero(p,n); visita(p); system("pause"); return; } ALBERO costruisci_albero(ALBERO p,int n){ srand(time(NULL)); int i; if(n==0) p=NULL; else{ for(i=1;i<=n;i++) p=malloc(sizeof(NODO)); p->val=(rand()%20)-20; p->sx->val=(p->sx,i); p->dx->val=(p->dx,i); } return p; } void visita(ALBERO p){ if(p!=NULL){ printf("%lf ",p->val); visita(p->sx); visita(p->dx); } return; }
Sicuramente c'è qualche problema nelle funzione costruisci_albero. Voi capite dove è l'errore??? perchè io non riesco a trovarlo.
grazie a tutti per l'eventuale aiuto.
Ciao.
Risposte
for(i=1; i<=n; i++) p=malloc(sizeof(NODO)); p->val=(rand()%20)-20; p->sx->val=(p->sx,i); p->dx->val=(p->dx,i);
Mancano le parentesi graffe che immagino dovrebbero esserci intorno al blocco che immagino dovrebbe venire eseguito ad ogni iterazione (in effetti viene eseguita solo la prima riga in questo modo). Inoltre fai uso di uno strano ciclo per il C (tutti gli indici partono sempre da zero ed è quindi più comune far partire i cicli da zero e non da uno come nel tuo caso. E' infine poco chiaro il motivo per cui tu stia utilizzando una sola variabile (non ci sono ragioni per cui tu non possa semplificare la lettura del codice e comprensione del codice facendo uso di diverse variabili locali) che viene passata inutilmente (viene subito sovrascritta) come parametro. E' infine curiosa la scelta del tipo della variabile \(n\), non sarebbe meglio fare uso di un tipo unsigned?
Nonosante abbia messo le parentesi e fatto partire il ciclo for da zero(cosa che ai fini del compilatore è ininfluente), il programmino va sempre in crash e mi esce....dove potrebbe essere questo errore

ALBERO costruisci_albero(ALBERO p,int n){ srand(time(NULL)); int i; if(n==0) p=NULL; else{ for(i=0;i<n;i++){ p=malloc(sizeof(NODO)); p->val=(rand()%20)-20; p->sx->val=(p->sx,i); p->dx->val=(p->dx,i); }} return p; }
Ciao, non avevo letto il codice con attenzione, solo visto che mancavano le parentesi. Ma èN proprio la logica ad essere sbagliata.. Non hai ad esempio inizializzato i due puntatori dei nodi. Inoltre le ultime due righe del ciclo non fanno molto probabilmente quello che ti immagini.. Il mio consiglio è quello di iniziare scrivendo una funzione che, dati un valore e due puntatori ai sottoalberi destro e sinistro, allochi e inizializzi un nuovo nodo. Potrai poi utilizzare questa funzione nell'altra per semplificare un po' la sua logica.