Ciao a tutti, è la prima volta che scrivo qui, vi prego di perdonare eventuali errori di forma.
Sto cercando di scrivere un codice per esercitarmi sulle liste dove il campo nodo è di tipo struct. Nello stesso tempo mi esercito ad utilizzare le funzioni e chiaramente usandole senza averne la completa padronanza mi complico la vita. Sono riuscito a scrivere il codice che ora vi posto (anche con l'aiuto della vostra guida in linea) in cui inserisco tramite la funzione ins_elem (che contiene la funzione ins_contact) i vari contatti nella lista, ma quando scelgo di visualizzali tramite la funzione visualizza, mi stampa il numero giusto degli elementi inseriti ma contenenti tutti i dati dell'ultimo contatto dato in input.

Inserendo i contatti tengo fermo in testa il puntatore p e faccio scorrere il puntatore punt;
stampando i contatti faccio scorrere il puntatore p che avevo lasciato in testa ma.........


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


//dichiaro la struttura di ogni contatto della rubrica++++++++++++++++++++++++++

struct contatti {
    char nome[30];
    char cog[30];
    char tel[20];
                 
}cont;

//dichiaro la struttura della lista+++++++++++++++++++++++++++++++++++++++++++++

struct elemento {
    struct contatti *contatto;             //1 campo costituito dal contatto (struttura completa)
    struct elemento *pun;        //2 campo costituito da un puntatore che punta alla successiva struct elemento
};

//dichiaro il prototipo della funzione di inserimento dei campi del contatto+++++++++++++++++++

struct contatti *ins_contact();

//dichiaro la funzione di formazione del primo elemento lista completo dei 2 campi (contatti e puntatore)

struct elemento *ins_elem();

//dichiaro la funzione di visualizzazione dei contatti

void visualizza(struct elemento*);

int main(int argc, const char * argv[])
{
    struct elemento *lista;//dichiarazione della lista (sempre un puntatore )
    lista=ins_elem();      //ora la creo
    char risp[2];
    printf("\nVuoi stampare la lista degli elementi? ");
    scanf("%s",risp);
    if (strcmp(risp,"s")==0) {
        visualizza(lista);
    }else {
        printf("\nCiao");
    }
    
    return 0;
}
//funzione ins-elem++++++++++++++++++++++
    
struct elemento *ins_elem() {
    struct elemento *p,*punt;
    int n,i;
    printf("quanti elementi vuoi inserire in rubrica? ");
    scanf("%d",&n);
    if (n==0) {
        p=NULL;
    }else {
        
        //inserimento primo contatto+++++++++++++++++++++++++++++++++++++++++++++++++++++++
        
        p=(struct elemento*)malloc(sizeof(struct elemento));
        printf("\nInserisci il primo elemento\n");
        ins_contact();
        p->contatto=&cont;
        punt=p;//associo il puntatore che scorrerà la lista 
        
        //creo gli altri elementi+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
        for (i=2; i<=n; i++) {
            punt->pun=(struct elemento*)malloc(sizeof(struct elemento));//creo l'altro elemento
            punt=punt->pun;
            printf("\nInserisci il %d elemento\n ",i);
            ins_contact();
            punt->contatto=&cont;
        }
        punt->pun=NULL;
    }
    return p;
}
struct contatti *ins_contact() {
    printf("\nInserisci il cognome: ");
    scanf("%s",cont.cog);
    printf("\nInserisci il nome   : ");
    scanf("%s",cont.nome);
    printf("\nInserisci il tel    : ");
    scanf("%s",cont.tel);
    return &cont;
}
void visualizza(struct elemento *p) {
    while (p!=NULL) {
        printf("\n %s %s %s ",p->contatto->cog,p->contatto->nome,p->contatto->tel);
        p=p->pun;
    }
    
}
ho scritto un codice uguale con il nodo tipo int (studiato sulla vostra guida in linea) e gira benissimo, qui non riesco a capire dove sbaglio: deve esserci un errore nell'inserimento ma non riesco a trovarlo.
Vi ringrazio in anticipo per l'eventuale dritta.
P.S. utilizzo xcode