Ciao,
ho sistemato alcune cose, in particolare ho praticamente riscritto la funzione creaLista. Di fatto non facevi correttamente l'inserimento in coda di un nuovo elemento. Il modo corretto di farlo è questo:
- scorri la lista fino alla fine, passando da un elemento al successivo
- quando sei arrivato all'ultimo elemento, "attacchi" quello nuovo

Io ho corretto il codice seguendo quello che avevi fatto, ma continua a non piacermi per un motivo molto semplice: preferirei che la parte di richiesta delle informazioni all'utente e quella di gestione della lista fossero separate. Significa che preferirei una funzione

codice:
struct elemento * ins_in_coda(struct elemento *lista, int nuovo_elemento)

che si occupasse solo di inserire un elemento in coda alla lista, lasciando il dialogo con l'utente (printf e scanf) ad altre parti del codice.

Comunque prova a dare un'occhiata a questo:

codice:
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>




#define OUT 100




struct elemento
{
    int codfisc;
    struct elemento *pun;
};


struct elemento *creaLista();
void visLista(struct elemento *);
struct elemento *paus=0;
int i=0;


int main()
{
    int scelta;
    char invio;
    struct elemento *punLista = NULL;
    while(scelta!=OUT)
    {
        system("cls");
        printf("\n\n\t\t ANAGRAFE");
        printf("\n\n 1. Immissione persona");
        printf("\n\n 2. Cancellazione persona");
        printf("\n\n 3. Ricerca persona");
        printf("\n\n 4. Visualizza anagrafe");
        printf("\n\n 0. Fine");
        printf("\n\n\n Scegliere una opzione\n");
        scanf("%d", &scelta);
        scanf("%c", &invio);
        printf("\n\n\n");
        switch(scelta)
        {
        case 0:
            scelta=OUT;
            break;
        case 1:
            i=i+1;
            printf("%d",i);
            punLista=creaLista(punLista);
            break;
        case 2:
        //canPer();
            break;
        case 3:
        //ricPer();
            break;
        case 4:
            visLista(punLista);
            break;
        }
    }


    return 0;




}




struct elemento *creaLista(struct elemento *head)
{
    struct elemento *p, *tmp;


    p = (struct elemento*) malloc(sizeof(struct elemento));
    p->pun = NULL;


    if(i == 1 && head == NULL)
    {
        printf("Inserisci il codice fiscale della 1a persona:\n");
        scanf("%d", &p->codfisc);
        head = p;
        return head;
    }


    printf("Inserisci il codice fiscale della %da persona:\n", i);
    scanf("%d", &p->codfisc);


    tmp = head;
    while(tmp->pun != NULL)
        tmp = tmp->pun;
    tmp->pun = p;
    return head;
}




void visLista(struct elemento *p)
{
    char invio;
    printf("punLista --->");
    while(p!=NULL)
    {
        printf("%d\n", p->codfisc);
        p=p->pun;
        printf("premere un tasto per vedere l'elemento successivo");
        scanf("%c", &invio);
    }
    printf("NULL\n");
}