Ciao a tutti.
Ho creato un ABR (Albero di ricerca binaria su stringhe dinamiche) ma non riesco a capire cosa c'è che non và.
In pratica il codice funziona,ma ci sono i seguenti 2 problemi: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"); }
- 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

Rispondi quotando