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".