buonasera a tutti scusate il disturbo ma ho un problema con questo programma

codice:
#include <stdio.h>
#include <iostream>
#include <string.h>
#include <stdlib.h>
typedef struct{
        char Nome[30];
        char Cognome[30];
        char Tel[30];   
        char Indirizzopaginaweb[50];
        char Indirizzoemail[50];
} Contatto;  

struct elemento{
       Contatto inf;  
       struct elemento *pun; 
};


void visualizzaContatto(struct elemento* p){
     if (p == NULL){
            printf (" # VISUALIZZA CONTATTO #\n");
            printf (" Nessun contatto presente\n");
            } else {
                   printf (" # VISUALIZZA CONTATTO #\n");
                   printf (" NOME > %s\n", p->inf.Nome);
                   printf (" COGNOME > %s\n", p->inf.Cognome);
                   printf (" TELEFONO > %s\n", p->inf.Tel);
                   printf (" SITOWEB > %s\n", p->inf.Indirizzopaginaweb);
                   printf (" EMAIL > %s\n", p->inf.Indirizzoemail);
                   }
                   while (p != NULL){
                             printf (" # VISUALIZZA CONTATTO #\n");
                             printf (" NOME > %s\n", p->inf.Nome);
                             printf (" COGNOME > %s\n", p->inf.Cognome);
                             printf (" TELEFONO > %s\n", p->inf.Tel);
                             printf (" SITOWEB > %s\n", p->inf.Indirizzopaginaweb);
                             printf (" EMAIL > %s\n", p->inf.Indirizzoemail);
                             p = p->pun;
                             system("PAUSE");
                             }
                             
                             }  

struct elemento *aggiungiContatto(struct elemento *p){
       printf (" # AGGIUNGI CONTATTO   #\n");
       char nome[50];
       char cognome[50];
       char telefono[30];
       char email[100];
       char sitoweb[200];
       Contatto daInserire;
       struct elemento *punt;

       punt = (struct elemento *)malloc(sizeof(struct elemento));
       p = (struct elemento *)malloc(sizeof(struct elemento));

       printf (" NOME > ");
       scanf ("%s", nome);
       strcpy(daInserire.Nome, nome);
       printf (" COGNOME > ");
       scanf ("%s", cognome);
       strcpy(daInserire.Cognome, cognome);
       printf (" TELEFONO > ");
       scanf ("%s", telefono);
       strcpy(daInserire.Tel, telefono);
       printf (" SITOWEB > ");
       scanf ("%s", sitoweb);
       strcpy(daInserire.Indirizzopaginaweb, sitoweb);
       printf (" EMAIL > ");
       scanf ("%s", email);
       strcpy(daInserire.Indirizzoemail, email);

       if(p != NULL){
            punt->inf = daInserire;
            punt->pun = p;     
            } else {
                   p->inf = daInserire;
                   p->pun = NULL;
                   punt = p;
                   }    
                   return(punt);    
}



struct elemento *rimuoviContatto(struct elemento *p){
       struct elemento *aus; 
       struct elemento *twin = p;
       int subscelta;
       int i=1;
       int n=1;
       printf (" # RIMUOVI CONTATTO    #\n");
       while (p != NULL){
             printf ("%i) \t %s \t %s\n", i, p->inf.Nome, p->inf.Cognome);
             p = p->pun; 
             i++;    
             }    
             p = twin; 
             printf("\n\n Inserisci il numero del contatto che vuoi rimuovere: ");
             scanf("%i", &subscelta);
             if (subscelta < i){
                           if(p == NULL)
                           return 0;

                           if(p->pun != NULL){
                                     aus=p;
                                     n++;
                                     while(n != i){
                                             if(subscelta == n){
                                                          aus->pun=aus->pun->pun;
                                                          } else {
                                                                 aus=aus->pun; 
                                                                 }
                                                                 n++;    
                                                                 }}


                                                                 if(subscelta == 1){
                                                                                   p=p->pun;    
                                                                                   }} 
                                                                                   twin = p;
                                                                                   return twin;   
}

bool cerca(struct elemento* p,char *c) {
     struct elemento *punt=p;
     bool trovato=false;
     while((punt!=NULL) && (!trovato)) {
                         if(strcmp(c,punt->inf.Cognome)==0)
                         trovato=true;
                         else
                         punt=punt->pun;
                         }
                         return(trovato);
}

void *leggiValore(struct elemento* p,char *c){
     struct elemento *punt=p;
     bool trovato=false;
     while((punt!=NULL) && (!trovato)) {
                        if(strcmp(c,punt->inf.Cognome)==0)
                        trovato=true;
                        else
                        punt=punt->pun;
                        }
                        printf("il valore relativo al contenuto inserito e':\n");
                        printf (" NOME > %s\n", punt->inf.Nome);
                        printf (" COGNOME > %s\n", punt->inf.Cognome);
                        printf (" TELEFONO > %s\n", punt->inf.Tel);
                        printf (" SITOWEB > %s\n", punt->inf.Indirizzopaginaweb);
                        printf (" EMAIL > %s\n", punt->inf.Indirizzoemail);
                        system("PAUSE");
}

void leggi(struct elemento* p,char *c){
     if (cerca(p,c)==true)
     leggiValore(p,c);
     else{
          printf("\n\nERRORE: il valore collegato al contenuto inserito NON ESISTE\n");
          system("PAUSE");
}}

void Cancella(struct elemento* p){
     struct elemento *aux;
     while (NULL != p){
           aux = p;
           p = p->pun;
           free(aux); 
}}

int main(){
    int scelta;
    struct elemento *lista = NULL;
    char c[50];

 do{
         printf (" 1) VISUALIZZA CONTATTO\n\n");
         printf (" 2) AGGIUNGI CONTATTO\n\n");
         printf (" 3) RIMUOVI CONTATTO\n\n");
         printf (" 4) CERCA CONTATTO\n\n");
         printf (" 5) ELIMINA TUTTA LA RUBRICA\n\n");
         printf (" 6) ESCI\n\n\n\n");
         printf (" la tua scelta > ");
         scanf("%d",&scelta);
         system("CLS");
         switch(scelta){
                        case 1:{
                             visualizzaContatto(lista);  
                             break;  
                             }
                        case 2:{
                             lista = aggiungiContatto(lista);
                             break; 
                             }
                        case 3:{
                             lista = rimuoviContatto(lista);
                             break;
                             }
                        case 4:{
                             printf("Inserisci il cognome che vuoi leggere: \n");
                             scanf("%s", c);
                             leggi(lista,c);
                             break;
                             }
                        case 5:{
                             Cancella(lista);
                             lista=NULL;
                             break;
                             }
                             system("PAUSE");
                             system("CLS");
                             }}while(scelta!=6);
                             return 0;
}

compilate il programma e se potete dammi qualche consiglio ve ne sarei grato
grazie in anticipo