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;
             }
       }
}