E per quanto riguarda la funzione visualizza può essere che sia perchè richiami la funzione con NULL (caso non gestito dalla tua funzione)...

Puoi benissimo semplificare la funzione a
codice:
void visualizza(alb *r){
     if(r!=NULL) {
         visualizza(r->left);
         printf("%s", r->cognome);
         visualizza(r->right);  
     }   
}