Visualizzazione dei risultati da 1 a 2 su 2
  1. #1

    [C] Aggiungi nuovo elemento ad ABR

    Ciao a tutti.
    Ho creato un ABR (Albero di ricerca binaria su stringhe dinamiche) ma non riesco a capire cosa c'è che non và.
    codice:
    #include <stdlib.h>
    #include <stdio.h>
    
    typedef struct nodo
    {
     char* nome;
     int numero;
     struct nodo *sx;
     struct nodo *dx;
    } Nodo;
    typedef Nodo* Albero;
    
    Albero Crea()
    {
     return NULL;      
    }
    
    Albero Aggiungi(Albero radice,char *name)
    {
     Nodo *rad;
     Albero new;
     if(radice==NULL)
     {
      new=(Albero)malloc(sizeof(Nodo));
      new->numero=1;
      new->nome=(char*)malloc(sizeof(char)*(strlen(name)+1));
      strcpy(new->nome,name); 
      new->dx=NULL;
      new->sx=NULL;
      return new;
     }
     if(strcmp(name,radice->nome)<=0)
     {
      rad=radice->sx=Aggiungi(radice->sx,name);
      return rad;                 
     }
     rad=radice->dx=Aggiungi(radice->dx,name);
     return rad;
    }
    
    int main()
    {
     Albero Root,NewElem;
     int dim,i,lunghSTR;
     char* stringa;
     char str_tmp[50];
     Root = Crea();
     printf("#### AGGIUNGI Elementi ####");
     printf("\nInserisci il numero di elementi (STRINGHE) da inserire:");
     scanf("%d",&dim);
     for(i=0;i<dim;i++)
     {
      printf("\nInserisci la stringa %d:\t",i+1);
      scanf("%s",str_tmp);
      stringa=(char*)malloc(sizeof(char)*(strlen(str_tmp)+1));
      strcpy(stringa,str_tmp);  
      NewElem=Aggiungi(Root,stringa);
      if(Root==NULL)
         Root=NewElem;
      printf("Il contenuto dell'elemento RADICE e':%s (numero:%d)",Root->nome,Root->numero);
      printf("\nIl contenuto dell'elemento Aggiunto e':%s (numero:%d)",NewElem->nome,NewElem->numero);
     }                  
     printf("\n");
    }
    In pratica il codice funziona,ma ci sono i seguenti 2 problemi:
    - non sò come fare in modo di gestire correttamente il campo numero della struttura Nodo cosicchè la radice abbia numero=1,il successivo elemento in ordine lessicografico abbia numero=2,il terzo numero=3 e cosi via.
    - come gestire l'aggiunta di una stringa già presente nell'ABR(basta aggiungerla come figlio sx della stringa uguale,quando la trovo ma è la soluzione migliore?)
    -----------------------------------------------------------------------
    Vi incollo qui una soluzione (solo funzione,no main,fatta da un professore quindi ipoteticamente giusta) che non riesco capire bene(in particolare perchè si restituisce a volte l'elemento nuovo,altre l'elemento a e la if con il strcmp(...)==0).
    Ovviamente ho provato questa funzione con il mio main ma non ottengo altro (nell'output del main) che l'elemento radice sia in NewElem che Root e se provo ad accedere al nodo dx (che dovrebbe venire "riempito",inserendo in sequenza:ciao,dino) ma ottengo solo che il programma si blocca.
    codice:
    Albero Aggiungi(Albero a,char *n)
    {
     Albero nuovo;
     if(a==NULL)
     {
      nuovo=(Albero)malloc(sizeof(Nodo));
      nuovo->numero=1;
      nuovo->nome=(char*)malloc(sizeof(char)*(strlen(n)+1));
      strcpy(nuovo->nome,n); 
      nuovo->dx=NULL;
      nuovo->sx=NULL;
      return nuovo;
     }
     if(strcmp(a->nome,n)==0)
     {
      a->numero++;
      return a;                         
     }
     if(strcmp(n,a->nome)<0)
     {
      a->sx=Aggiungi(a->sx,n);
      return a;                 
     }
     a->dx=Aggiungi(a->dx,n);
     return a;
    }
    -----------------------------------------------------------------------

    Vi ringrazio in anticipo sia per le correzzioni nella mia versione che in quella che l'altra.
    Ciao

  2. #2
    nessuno che sappia aiutarmi?

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.