Sto scrivendo un programma didattico con gli alberi di ricerca binaria.
I problemi son 2:
-nella funzione visualizza, alla prima riga, mi da una violazione di accesso, errore di segmentazione, se uso il debug.
-nel secondo caso dello switch, non mi legge la fgets il cui argomento è n->indirizzo, quella commentata affianco tanto per intenderci.
Quali sono gli errori?
codice:
//*16. Utilizzando un albero binario di ricerca gestire un programma RUBRICA in cui in ogni nodo sono memorizzati i dati seguenti:
a. Cognome
b. Nome
c. Sesso (M o F)
d. Indirizzo
e. Telefono
f. Età
Applicare il seguente menù:
0 - esci
1 - Inserisci nuovo elemento con caricamento ordinato per cognome e quindi per nome
2 - Cerca elemento X
3 - Visualizza tutto
4 - Statistiche: età media dei maschi e delle femmine
5 - Modifica dati elemento X
6 - Incrementa l'età d’ogni elemento di 1 (nuovo anno)*/
#include <conio.h>
#include <stdio.h>
#include <string.h>
typedef struct rubr{
char cognome[20];
char nome[20];
char sesso;
char indirizzo[20];
char tel[10];
int eta;
struct rubr *left;
struct rubr *right;
}alb;
void inizializza(alb **r){
*r=NULL;
}
alb *inserisci(alb *r, char cognome[]){
if(r==NULL){
r=(alb *)malloc(sizeof(alb));
r->left=NULL;
r->right=NULL;
return r;
}else if(strcmp((r->cognome),cognome)<0){
return inserisci(r->left,cognome);
}else{
return inserisci(r->left,cognome);
}
}
void visualizza(alb *r){
if(r->left!=NULL)
visualizza(r->left);
//puts(r->cognome);
printf("%s",r->cognome);
if(r->right!=NULL)
visualizza(r->right);
}
void menu(){
printf("0-Esci\n");
printf("1-Inserisci un nuovo contatto\n");
//printf("0-Inserisci un nuovo contatto\n");
printf("3-Visualizza\n");
printf("Inserisci la tua scelta: ");
}
main(){
alb *root;
inizializza(&root);
int scelta=1;
char cognome[20];
while(scelta!=0){
system("cls");
menu();
scanf("%d",&scelta);
switch(scelta){
case 1:
system("cls");
printf("Inserisci il cognome,\n\t il nome,\n\t il sesso(S o M),\n\t l'indirizzo,\n\t il telefono \n\te l'eta',\n ognuno separato da un invio: ");
fflush(stdin);
fgets(cognome, sizeof(cognome), stdin);
alb *n=inserisci(root, cognome);
strcpy(cognome,n->cognome);
fgets(n->nome, sizeof(n->nome), stdin);
scanf("%c",&n->sesso);
fgets(n->indirizzo, sizeof(n->indirizzo), stdin); //this fgets() isn't called
fgets(n->tel, sizeof(n->tel), stdin);
scanf("%d",&n->eta);
break;
/*case 2:
break; */
case 3:
system("cls");
visualizza(root);
getch();
break;
}
}
}