Ecco il codice:

codice:
#include <stdio.h>
#include <string.h>

#define MAXELE 30
#define DIM 31
#define MENU 0
#define INS 1
#define CAN 2
#define RIC 3
#define VIS 4
#define OUT 100

/* Semplice struttura che modella una persona */

struct per {
       
       char cognome[DIM];   /* La dimensione l'abbiamo dichiarata all'inizio con #define DIM 31 */
       char nome[DIM];
       char ind[DIM];
       int eta;
       
       };
       
/*  Vettore persone */

struct per anag[MAXELE]; /* Dovrebbe stabilire il numero massimo di elementi e quindi persone */

/* Numero elementi allocati nel vettore anag */

int index = 0;

int menPer(void);
int insPer(int);
struct per * cerPer(char *,char *, int);  /* Capita la funzione, perchè mette *? */
void eliPer(struct per *);   /* eliPer si riferisce ad una strutta, perchè deve eliminare tutto */
void canPer(void);           /* Questa funzione invece la definiamo noi dopo */
void ricPer(void);           /* Questa funzione invece la definiamo noi dopo */
void visPer(struct per *);   /* visPer si riferisce ad una strutta, perchè deve eliminare tutto */
void visAnagrafe(void);

/* Presenta il menu e lancia la funzione a scelta */

int main()
{
     
     int scelta = MENU;
     
     while(scelta!=OUT){
     switch(scelta){
                   
                   case MENU:
                        scelta = menPer();
                        if(scelta == MENU)
                          scelta = OUT;
                          break;
                          
                   case INS:
                        index = insPer(index);
                        scelta = MENU;
                        break;
                        
                   case CAN:
                        canPer();
                        scelta = MENU;
                        break;
                        
                   case RIC:
                        ricPer();
                        scelta = MENU;
                        break;
                        
                   case VIS:
                        visAnagrafe();
                        scelta = MENU;
                        break;
                   
                   }
                   }
                   }

          
/*  MENU */

int menPer(void)
{
    int scelta;
    char invio;
    int vero = 1;
    
    while(vero){
                printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
                printf("\t\t\t ANAGRAFE");
                printf("\n\n\n\t\t\t 1. Immissione Persona");
                printf("\n\n\n\t\t\t 2. Cancellazione Persona");
                printf("\n\n\n\t\t\t 3. Ricerca Persona");
                printf("\n\n\n\t\t\t 4. Visualizza Anagrafe");
                printf("\n\n\n\t\t\t 0. Fine");
                printf("\n\n\n\t\t\t\t\t. Scegliere una opzione: ");
                scanf("%d", &scelta);
                scanf("%c", &invio);
                printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
                
                switch(scelta){
                               
                               case 0:
                               case 1:
                               case 2:
                               case 3:
                               case 4:
                                    return(scelta);
                                    default:
                                      break;
                                      }
                                      }
                                
                                return(0);
                                }
                 
/* Inserisce persona nell'anagrafe */

int insPer(int pos)
{
    char invio;
    if(pos>=MAXELE){
       printf(" Non si possono inserire altri nomi ");
       scanf("%c",&invio);
       return(pos);
        }
    
    printf("\n\tINSERIMENTO PERSONA");   /* Da dove e' uscito fuori pos? */
    printf("\n\t\t------------\n\n");
    printf("\nCognome: ");
    gets(anag[pos].cognome);
    printf("\nNome: ");
    gets(anag[pos].nome);
    printf("\nIndirizzo: ");
    gets(anag[pos].ind);
    printf("\nEta':");
    scanf("%d", &anag[pos].eta);
    scanf("%c", &invio);
    pos++;
    return(pos);
    }
    
    /* Cancella persona dall'anagrafe, se presente */
    
    void canPer(void)
    {
         char pausa;
         char cognome[DIM], nome[DIM];
         int eta;
         struct per *ps;          /* Utilizza un puntatore */
         
         printf("\n\t\t CANCELLA PERSONA");
         printf("\n\t\t------\n\n");
         printf("\nCognome:");
         gets(cognome);           /* Perchè qua non compare anag[pos] ? */
         printf("\nNome: ");
         gets(nome);
         printf("\nEta':");
         scanf("%d",&eta);
         scanf("%c",&pausa);
         
    /* Invoca ricerca persona */
         
         ps = cerPer(cognome, nome, eta);
         if(ps == NULL){
               printf("\nPersona non presente in anagrafe");
               scanf("%c",&pausa);
               return;             /* A cosa serve questo return e perchè lo usa spesso? */
               }
    
    /* Invoca visualizza persona */
    visPer(ps);
    printf("\nConfermi cancellazione? (S/N)");
    scanf("%c", &pausa);
    if(pausa=='S' || pausa=='s'){
                  eliPer(ps);
                  return;         
         }         
         }
         
    /*  Elimina persona dall'anagrafe */
    
    void eliPer(struct per *p)
    {
         strcpy(p->cognome, "");
         strcpy(p->nome, "");
         strcpy(p->ind, "");
         p->eta = 0;
          }
          
    /* Ricerca persona se presente nell'anagrafe */
    
    void ricPer(void)
    {
         char pausa;
         char cognome[DIM], nome[DIM];
         int eta;
         struct per *ps;
    
    /* Inserimento dati persona da ricercare */
       
         printf("\n\t RICERCA PERSONA");
         printf("\n\t\t-------\n\n");
         printf("\nCognome:");
         gets(cognome);
         printf("\nNome:");
         gets(nome);
         printf("\nEta':");
         scanf("%d",&eta);
         scanf("%c",&pausa);
    
    /* Invoca la funzione di scansione sequenziale */
     
         ps = cerPer(cognome, nome, eta);
         if(ps == NULL){
               
               printf("\nPersona non presente in anagrafe");
               scanf("%c", &pausa);
               return;
               }
               
         visPer(ps);
         scanf("%c", &pausa);
         }
         
     /* Scansione sequenziale del vettore anag alla ricerca di una persona che abbia determinati cognome, nome ed età */
     
     struct per *cerPer(char *cg,char *nm,int et)
     {
     int i;
     for (i=0; i<=index; i++){
        if(strcmp(cg, anag[i].cognome) == 0)
         if(strcmp(nm, anag[i].nome) == 0)
          if(et == anag[i].eta)
            return(&anag[i]);
            }
         
         return(NULL);
         }
         
     /* Visualizza persona */
     
        void visPer(struct per *p)
        {
             printf("\n\n------------------\n");
             printf("\n\t\tCognome: %s", p->cognome);
             printf("\n\t\tNome: %s", p->nome);
             printf("\n\t\tIndirizzo: %s", p->ind);
             printf("\n\t\tEta': %d", p->eta);
             printf("\n\n------------------\n");
             }
     
     /* Visualizza l'anagrafe completa */
     
        void visAnagrafe(void)
        {
             int i; char pausa;
             struct per *ps = &anag[0];
             for(i=0; i<index; i++){
                      visPer(ps++);
                      scanf("%c",&pausa);
                      }
}