Alberi con operazioni su nodi

nadia891
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
Raptorista1
Scusami, vorresti forse che ti correggiamo il codice??

Oppure hai delle domande più specifiche?

claudio862
Nella seconda chiamata a "scanf" nella funzione "albBin" passi la variabile "o" invece del suo indirizzo. Correggi con

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

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