Perche' questa parte

codice:
      struct record
      {
             char nome[10];
             char cognome[15];
             char indirizzo[25];
             char ntel[15];
             char ncel[15];
      }*buffer;

 double caricamento(void);
 double cerca(void);
 double stamparub(void);
 double stampacell(void);
lo hai posto dentro il main? Deve stare fuori ...

E poi, se dichiari

double caricamento(void);

perche' dopo diventa

void caricamento(void);

?

E dopo la while, il programma termina? Se e' cosi' ci vuole la }
ma mi sembra abbastanza strano che termini cosi' ...