Questa è una versione funzionante della tua lista, che come commento ha dove sbagli:
codice:
#include <stdio.h>
#include <stdlib.h>

struct mp3 {
        int id;
        struct mp3 *punt;
};

struct mp3 *crealista (int, struct mp3*);
void visualizza (struct mp3*);

int main() {
        struct mp3 *puntLista = NULL;
        int n, i, id;
        n = 5;
        for (i = 0; i < n; i++) {
                printf ("Inserisci il %d numero: ", i + 1);
                fflush (stdin);
                scanf ("%d", &id); /* indirizzo della variabile */
                puntLista = crealista (id, puntLista); /* punto alla nuova struttura */
        }
        visualizza (puntLista);
        return (0);
}

struct mp3 *crealista (int number, struct mp3 *testa) {
        struct mp3 *p;
        p = (struct mp3 *) malloc (sizeof (struct mp3));
        p -> id = number; /* metto il numero */
        p -> punt = testa; /* metto il vecchio indirizzo della struct */
        return (p); /* ritorno il nuovo indirizzo della struttura */
}                       

void visualizza (struct mp3* list) { /* visualizzo, passando il punt per indirizzo, tanto nn devo ritornare nada :) */
        while (list) {
                printf ("%d \n", list -> id);
                list = list -> punt; 
        }
}
Ciao!