Alberi con operazioni su nodi
Un esercizio richiede di creare un albero e due funzioni : una che somma tutte le occorrenze e un'altra che ricerca la minima occorrenza
#include <stdio.h> #include <stdlib.h> struct node{ int inf; int occorrenza; struct node *albSin; struct node *albDes; }; struct node *albBin(void); struct node *creaNodo(struct node *p,int val,int occ); int somma(struct node *p); int min(struct node *p); int m=1000000; int main(void) { struct node *radice; /*puntatore alla radice dell'albero*/ struct node *trovato;/*puntatore al valore da ricercare*/ trovato=NULL; int n; radice=albBin();/*crea l'albero binario*/ printf("La somma e':%d", somma(radice)); printf("\n%d",min(radice)); return 0; } struct node *albBin(void) { struct node *p=NULL; int n; int o; for(;;){ printf("\nInserire una informazione (0 per finire):"); scanf("%d",&n); if(n==0) break; printf("Inserire un'occorrenza:"); scanf("%d",o); p=creaNodo(p,n,o); } return (p); } struct node *creaNodo(struct node *p,int val,int occ) { if(p==NULL){ p=malloc(sizeof(struct node)); p->inf=val; /*inserimento di etichetta*/ p->occorrenza=occ; p->albSin=NULL; p->albDes=NULL; } else { if(val > p->inf)/*val maggiore del campo inf della radice */ p->albDes=creaNodo(p->albDes,val,occ); else if(val < p->inf) p->albSin=creaNodo(p->albSin,val,occ); } return (p); } int somma(struct node *p) { if(p==NULL) return 0; else return somma(p->albSin)+somma(p->albDes)+p->occorrenza; } int min(struct node *p) { if(p!=NULL){ if(p->occorrenza < m) m =p->occorrenza; min(p->albSin); min(p->albDes); } return m; }
Risposte
Scusami, vorresti forse che ti correggiamo il codice??
Oppure hai delle domande più specifiche?
Oppure hai delle domande più specifiche?
Nella seconda chiamata a "scanf" nella funzione "albBin" passi la variabile "o" invece del suo indirizzo. Correggi con
Questo problema si risolve abilitando i warning del compilatore, per esempio compilando con
Esempio (io uso Clang, GCC mostrerà messaggi simili):
Come vedi il secondo messaggio ti dice che si aspetta un "int *", mentre la variabile "o" ha tipo "int".
struct node *albBin(void) { struct node *p = NULL; int n; int o; for (;;) { printf("\nInserire una informazione (0 per finire):"); scanf("%d", &n); if(n==0) break; printf("Inserire un'occorrenza:"); scanf("%d", &o); // QUESTA LINEA p = creaNodo(p,n,o); } return (p); }
Questo problema si risolve abilitando i warning del compilatore, per esempio compilando con
gcc -std=c99 -pedantic -Wall -Wextra source.c -o source.exe
Esempio (io uso Clang, GCC mostrerà messaggi simili):
> clang -std=c99 -pedantic -Wall -Wextra test.c -o test.exe test.c:27:9: warning: unused variable 'n' [-Wunused-variable] int n; ^ test.c:52:20: warning: format specifies type 'int *' but the argument has type 'int' [-Wformat] scanf("%d",o); ~~ ^ test.c:52:20: warning: variable 'o' is uninitialized when used here [-Wuninitialized] scanf("%d",o); ^ test.c:44:10: note: initialize the variable 'o' to silence this warning int o; ^ = 0 3 warnings generated.
Come vedi il secondo messaggio ti dice che si aspetta un "int *", mentre la variabile "o" ha tipo "int".