Xfree
16-07-2007, 19:35
Ciao a tutti.
Ho fatto un piccolo esercizio che carica da file delle informazioni riguardanti i generi dei libri in un ABR e poi ricerca il genere nell'albero stesso,
solo che quest'ultima non c'è verso di farla funzionare.:mbe:
Mi da sempre "Non trovato", quindi come se il puntatore fosse sempre NULL,
ma non sono riuscito a capire perché.
Codice del programma
/*
Creazione di un albero binario con lettura informazioni da file e visita in ordine anticipato
e ricerca binaria. L'etichetta dei nodi è una stringa.
*/
#include <stdio.h>
#include <malloc.h>
#define MAX 50
struct nodo {
char inf[MAX];
struct nodo *sx;
struct nodo *dx;
};
struct tlibro{
char autori[MAX];
char titolo[MAX];
char tipologia[MAX];
};
struct nodo *albBin(void);
struct nodo *creaNodo(struct nodo *, char val[]);
void anticipato(struct nodo *);
void ricBin(char val[],struct nodo *);
main()
{
char cerca[MAX];
struct nodo *radice; /* puntatore alla radice dell'albero */
radice = albBin(); /* invoca la funzione per la creazione
dell'albero binario */
printf("\nVISITA IN ORDINE ANTICIPATO\n");
anticipato(radice);
printf("\nRICERCA BINARIA\n");
printf("Inserisci la stringa da cercare: ");
scanf("%s",&cerca);
ricBin(cerca,radice);
system("pause");
}
/* Crea l'albero binario. Per ogni etichetta immessa
dall'utente, invoca la funzione creaNodo.
Ritorna al chiamante la radice dell'albero */
struct nodo *albBin(void)
{
struct nodo *p = NULL;
struct tlibro libro;
FILE *fp;
fp=fopen("libri.txt","r");
if(fp==NULL)
printf("Si e' verificato un'errore nell'apertura del file\n");
else{
while(!feof(fp)){
fgets(libro.autori,MAX,fp);
fgets(libro.titolo,MAX,fp);
fgets(libro.tipologia,MAX,fp);
p=creaNodo(p,libro.tipologia);
//printf("%s",libro.autori);
//printf("%s",libro.titolo);
//printf("%s",libro.tipologia);
}
fclose(fp);
}
return(p); /* ritorna la radice */
}
/* Visita ricorsivamente l'albero alla ricerca del punto di
inserimento. Quando trova la posizione, crea un nodo, vi
inserisce l'etichetta e ritorna il puntatore a tale nodo.
Parametri in ingresso:
p e' il puntatore alla radice
val e' l'etichetta da inserire nel nodo */
struct nodo *creaNodo(struct nodo *p, char val[])
{
if(p==NULL) { /* il punto di inserimento e' stato reperito */
/* Creazione del nodo */
p=(struct nodo *) malloc(sizeof(struct nodo));
strcpy(p->inf,val); /* inserimento di val in elemento */
p->sx = NULL; /* marca di albero sinistro vuoto */
p->dx = NULL; /* marca di albero destro vuoto */
}
else{ /* ricerca del punto di inserimento */
if(strcmp(val,p->inf)>0){
/* Visita il sottoalbero destro */
p->dx = creaNodo(p->dx, val);
}
else{
/* Visita il sottoalbero sinistro */
p->sx = creaNodo(p->sx, val);
}
}
return(p); /* ritorna il puntatore alla radice */
}
/* Visita l'albero binario in ordine anticipato */
void anticipato(struct nodo *p)
{
if(p!=NULL) {
printf("%s",p->inf); /* visita la radice */
anticipato(p->sx); /* visita il sottoalbero sinistro */
anticipato(p->dx); /* visita il sottoalbero destro */
}
}
void ricBin(char val[],struct nodo *p)
{
if(p==NULL)
printf("Non trovato");
else if(strcmp(val,p->inf)==0)
printf("Trovato");
else if(strcmp(val,p->inf)<0)
ricBin(val,p->sx);
else
ricBin(val,p->dx);
}
File libri.txt
DANTE
LA DIVINA COMMEDIA
COMMEDIA
DESCARTES
DISCORSO SUL METODO
SAGGISTICA
UMBERTO ECO
IL NOME DELLA ROSA
LETTERATURA
JULES VERNE
20000 LEGHE SOTTO I MARI
FANTASCIENZA
NICK HORNBY
ALTA FEDELTA
ROMANZO
Ho fatto un piccolo esercizio che carica da file delle informazioni riguardanti i generi dei libri in un ABR e poi ricerca il genere nell'albero stesso,
solo che quest'ultima non c'è verso di farla funzionare.:mbe:
Mi da sempre "Non trovato", quindi come se il puntatore fosse sempre NULL,
ma non sono riuscito a capire perché.
Codice del programma
/*
Creazione di un albero binario con lettura informazioni da file e visita in ordine anticipato
e ricerca binaria. L'etichetta dei nodi è una stringa.
*/
#include <stdio.h>
#include <malloc.h>
#define MAX 50
struct nodo {
char inf[MAX];
struct nodo *sx;
struct nodo *dx;
};
struct tlibro{
char autori[MAX];
char titolo[MAX];
char tipologia[MAX];
};
struct nodo *albBin(void);
struct nodo *creaNodo(struct nodo *, char val[]);
void anticipato(struct nodo *);
void ricBin(char val[],struct nodo *);
main()
{
char cerca[MAX];
struct nodo *radice; /* puntatore alla radice dell'albero */
radice = albBin(); /* invoca la funzione per la creazione
dell'albero binario */
printf("\nVISITA IN ORDINE ANTICIPATO\n");
anticipato(radice);
printf("\nRICERCA BINARIA\n");
printf("Inserisci la stringa da cercare: ");
scanf("%s",&cerca);
ricBin(cerca,radice);
system("pause");
}
/* Crea l'albero binario. Per ogni etichetta immessa
dall'utente, invoca la funzione creaNodo.
Ritorna al chiamante la radice dell'albero */
struct nodo *albBin(void)
{
struct nodo *p = NULL;
struct tlibro libro;
FILE *fp;
fp=fopen("libri.txt","r");
if(fp==NULL)
printf("Si e' verificato un'errore nell'apertura del file\n");
else{
while(!feof(fp)){
fgets(libro.autori,MAX,fp);
fgets(libro.titolo,MAX,fp);
fgets(libro.tipologia,MAX,fp);
p=creaNodo(p,libro.tipologia);
//printf("%s",libro.autori);
//printf("%s",libro.titolo);
//printf("%s",libro.tipologia);
}
fclose(fp);
}
return(p); /* ritorna la radice */
}
/* Visita ricorsivamente l'albero alla ricerca del punto di
inserimento. Quando trova la posizione, crea un nodo, vi
inserisce l'etichetta e ritorna il puntatore a tale nodo.
Parametri in ingresso:
p e' il puntatore alla radice
val e' l'etichetta da inserire nel nodo */
struct nodo *creaNodo(struct nodo *p, char val[])
{
if(p==NULL) { /* il punto di inserimento e' stato reperito */
/* Creazione del nodo */
p=(struct nodo *) malloc(sizeof(struct nodo));
strcpy(p->inf,val); /* inserimento di val in elemento */
p->sx = NULL; /* marca di albero sinistro vuoto */
p->dx = NULL; /* marca di albero destro vuoto */
}
else{ /* ricerca del punto di inserimento */
if(strcmp(val,p->inf)>0){
/* Visita il sottoalbero destro */
p->dx = creaNodo(p->dx, val);
}
else{
/* Visita il sottoalbero sinistro */
p->sx = creaNodo(p->sx, val);
}
}
return(p); /* ritorna il puntatore alla radice */
}
/* Visita l'albero binario in ordine anticipato */
void anticipato(struct nodo *p)
{
if(p!=NULL) {
printf("%s",p->inf); /* visita la radice */
anticipato(p->sx); /* visita il sottoalbero sinistro */
anticipato(p->dx); /* visita il sottoalbero destro */
}
}
void ricBin(char val[],struct nodo *p)
{
if(p==NULL)
printf("Non trovato");
else if(strcmp(val,p->inf)==0)
printf("Trovato");
else if(strcmp(val,p->inf)<0)
ricBin(val,p->sx);
else
ricBin(val,p->dx);
}
File libri.txt
DANTE
LA DIVINA COMMEDIA
COMMEDIA
DESCARTES
DISCORSO SUL METODO
SAGGISTICA
UMBERTO ECO
IL NOME DELLA ROSA
LETTERATURA
JULES VERNE
20000 LEGHE SOTTO I MARI
FANTASCIENZA
NICK HORNBY
ALTA FEDELTA
ROMANZO