Ho visto un pò i 2 frammenti di codice:
p->succ=t;
t=p;
è sbagliato perxchè tu passi un puntatore alla testa e così salvi in p->succ l'indirizzo di t e non il valore puntato da t...

struct scheda **t,
io tramite un typedef creerei un puntatore a scheda:

typedef struct scheda* punt;

e nella funzione lo passi così:

int inserisci (punt *t, int val, char *nome, char *cogn)