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