Controlla se fai bene l'inserimento, che il problema non è nella lettura come detto primaOriginariamente inviato da kafley non trova il NULL che dovrebbe trovarsi come figlio delle foglie![]()
Controlla se fai bene l'inserimento, che il problema non è nella lettura come detto primaOriginariamente inviato da kafley non trova il NULL che dovrebbe trovarsi come figlio delle foglie![]()
sono pronto a scommettere che non hai passato la variabile i come puntatore di un intero inizializzato a 0 (se è così leggi bene la prossima volta per favore)
cmq da questa prova si capisce che il mio script funziona benissimo... confrontalo a come lo hai scritto tu
facci sapere!
(spero non sia un esercizio delle vacanze)
codice:#include <stdio.h> #define MAXARRAY 3 typedef struct node { int inf; struct node *sx, *dx; } * nodo; nodo costruisci(int info, nodo sin, nodo des) { nodo v = malloc(sizeof(struct node)); v->inf=info; v->sx=sin; v->dx=des; return v; } void stampalbero(nodo radice) { if (radice==NULL) return; stampalbero(radice->sx); printf("%d ",radice->inf); stampalbero(radice->dx); } void stamparry(int array[]) { int i; for(i=0;i<MAXARRAY;i++) printf("%d ",array[i]); } void copia(int array[],nodo rad,int *i) { if (rad==NULL) return; copia(array,rad->sx,i); array[(*i)++]=rad->inf; copia(array,rad->dx,i); } main() { nodo figlio1=costruisci(2,NULL,NULL); nodo figlio2=costruisci(6,NULL,NULL); nodo radice=costruisci(4,figlio1,figlio2); printf("Stampa dell'albero:\t"); stampalbero(radice); printf("\n...e fin qui tutto ok\nStampa dell'array:\t"); int array[MAXARRAY]; int i=0; copia(array,radice,&i); stamparry(array); printf("\n...e qui ancora tutto ok\n"); }
il codice che io uso per l inserimento dei valori in un albero binario di ricerca e che ho sempre usato in altri esercizi riusciti é:
codice:#include <stdio.h> #include <malloc.h> typedef struct nodo { int info; struct nodo *sinistro; struct nodo *destro; }nod; int vuoto(nod *rad) { if(rad)/*rad == NULL*/ return 0;/*albero vuoto*/ else return 1;/*albero non vuoto*/ } Secondo voi è sbagliato? nod *inserisci(nod *punt,int numero) { if (vuoto(punt))/*se punt==NULL*/ { punt=(nod*)malloc(sizeof(nod));/*inserimento valore*/ punt->info=numero; punt->sinistro=NULL; punt->destro=NULL; } else { if (numero>punt->info)/*scorriamo a destra*/ { printf("inseriamo a destra di %d \n",punt->info); punt->destro=inserisci(punt->destro,numero); } else /*scorriamo a sinistra*/ { printf("inseriamo a sinistra di %d \n",punt->info); punt->sinistro=inserisci(punt->sinistro,numero); } } printf("valore di punt uguale a %d \n",punt->info); return punt; } nod *crea_albero() { int val; nod *p; p=NULL; do { printf("INSERIRE VALORE : \n"); scanf("%d", &val); if (val!=0) /*possiamo inserire il valore*/ p=inserisci(p,val); } while (val!=0); return p; } void visita_in_ordine(nod *radice) { if(radice!=NULL) { visita_in_ordine(radice->sinistro); printf("%d ",radice->info); visita_in_ordine(radice->destro); } } int main() { nod *rad; printf("creazione ALBERO \n"); rad=crea_albero(); printf("VISITA IN ORDINE :\n "); visita_in_ordine(rad); printf("\n"); system("PAUSE"); }
il codice ha un problema nel controllare se l'albero è vuoto
cmq tanto per essere sicuro... hai capito come risolvere il tuo problema?
prima ho postato un intero esempio di come potresti fare per risolverlo e ti ho anche scritto due righe sopra per eventuali chiarimenti. le hai lette?
EDIT:
per migliorare la tua libreria potresti riscrivere la funzione vuoto così:
restituisce 1 se l'albero è vuotocodice:int vuoto(nod *rad) { return (rad==NULL) }
restituisce 0 se l'albero non è vuoto
grazie funziona l esercizio. sbagliavo quando andavo ad inizializzare i nel main. Cioè dichiaravo i come puntatore ad intero. grazie di nuovo
di nulla!
son contento di averti aiutato... cmq volevo fare notare un'altra differenza:
io ho definito il tipo di nodo con typedef struct nodo * nod, già puntatore... per questo nelle funzioni non ci metto mai * come hai fatto tu
ciao