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