Salve a tutti scusate il disturbo. Ho un problema con la funzione visualizza, all'interno di questo programma.

codice:
#include<iostream> //librerie I/O
#include<stdio.h> 
#include<stdlib.h> //libreria per l'allocazione dinamica della memoria
#include<string.h> //libreria per la gestione delle stringhe

typedef struct Contatto {
                        char Nome [50];
                        char Cognome [50];
                        char Numero [40];
                        char Email[100];
                        char IndPaginaWeb [100];
                        }; //definizione del tipo strutturato contatto

struct Elemento; //questo è la pre-dichiarazione degli elementi della lista
typedef Elemento *punt; //definizione del puntatore all'elemento successivo

typedef struct Elemento {
                        Contatto Informazione;
                        punt next;
                        }; //dichiarazione del nodo completo

punt Inserisci (punt q)
     { char nome[50];
       char cognome[50];
       char numero[40];
       char email[100];
       char sitoweb[100];
       Contatto Inf;
       punt p;
       q= (punt)malloc(sizeof(Elemento)); //dichiarazione di q come record: è un puntatore 
       //allo spazio dati necessario alla rappresentazione del record
       printf("\n Nome: ");
       scanf("%s", &nome);
       strcpy(Inf.Nome, nome);
       printf("\n Cognome: ");
       scanf("%s", &cognome);
       strcpy(Inf.Cognome, cognome);
       printf("\n Numero: ");
       scanf("%s", &numero);
       strcpy(Inf.Numero, numero);
       printf("\n Email: ");
       scanf("%s", &email);
       strcpy(Inf.Email, email);
       printf("\n Sito Web: ");
       scanf("%s", &sitoweb);  
       strcpy(Inf.IndPaginaWeb, sitoweb);
       q->Informazione = Inf;
       p=q->next;
       bool PosTrovata = 0;
        if (p=NULL) p=q;
        else while ((p!=NULL) && (PosTrovata ==0))
             { 
               if(Inf.Nome>p->Informazione.Nome) p=p->next;
               if(Inf.Nome<=p->Informazione.Nome) PosTrovata= 1;
             }
      
       return (q);
       }

void Visualizza (punt q) 
     {
      int i=0;
      if(q==NULL) printf("Non e' presente alcun contatto \n");
      while (q!=NULL) 
            { 
              i++;
              printf("\n \n Il contatto %d e' il seguente: \n", i);
              printf("Nome: %s", q->Informazione.Nome);
              printf("\n Cognome: %s", q->Informazione.Cognome);
              printf("\n Numero: %s", q->Informazione.Numero);
              printf("\n Email: %s", q->Informazione.Email);
              printf("\n Sito Web: %s", q->Informazione.IndPaginaWeb);
              q=q->next; // NB QUESTA FUNZIONE NON VA
              } 
      }               
      
              
              
int main ()
    { int i;
      Contatto I; punt puntatore = NULL;

      do {
          printf("\n Cosa vuoi fare?\n");
          printf("1- #AGGIUNGI CONTATTO# \n");
          printf("2- #CERCA CONTATTO# \n");
          printf("3- #ELIMINA CONTATTO#\n");
          printf("4- #ELIMINA TUTTI I CONTATTI PRESENTI#\n");
          printf("5- #VISUALIZZA TUTTI I CONTATTI#\n");
          printf("6- #MODIFICA CONTATTO# \n");
          printf("7- #ESCI#\n");
          scanf (" %d", &i);

          switch(i) {
                     case 1: {
                              printf("#AGGIUNGI CONTATTO#\n");
                              puntatore=Inserisci (puntatore); break;}

                     case 2: printf ("#CERCA CONTATTO#\n"); break;
                     case 3: printf("#ELIMINA CONTATTO#\n"); break;
                     case 4: printf("#ELIMINA TUTTI I CONTATTI PRESENTI#\n"); break;
                     case 5: {
                              printf("#VISUALIZZA TUTTI I CONTATTI#\n"); 
                              Visualizza(puntatore); break;} 

                     case 6: printf("#MODIFICA CONTATTO#\n"); break;
                     }

       } while (i!=7);

       if (i=7) return 0;
       system("PAUSE");
       return 0 ;
       }
A livello di compilazione sembra che non ci siano problemi, che invece insorgono durante l'esecuzione.
Praticamente nel momento in cui utilizzo la funzione visualizza e non sono presenti contatti, la funzione va, dunque non credo che nella prima parte della funzione vi siano problemi. Quando, ,dopo aver inserito dei contatti, provo a visualizzarli, viene visualizzato solo l'ultimo contatto inserito, e dopo che viene stampato a video, il computer mi dice che c'è stato un errore nel programma.... Sto iniziando a pensare che ci siano problemi nella funzione Inserisci, a questo punto....