Per una questione di leggibilità. Pensa di avere un software con decine di file sorgente e headers. e di dover creare una funzione che usi il tuo tipo t_list.
scrivendo
bool foo(t_list bar)
se sei furbo ti chiederai cosa è t_list, ma se non lo sei potresti pensare che sia una variabile semplice e non un puntatore. Potresti addirittura arrivare a scrivere
bool foo(t_list *bar)
Pensando di implementare una funzione che vuole in input un puntatore, con il risultato però di ottenere una funzione che vuole un puntatore di puntatore.
In poche parole, nascondere che un tipo è di per se un puntatore non è una grande idea quando il tuo codice viene utilizzato da più persone, o quando tu stesso non ci lavori da molto e perdi memoria di quello che hai fatto.
Considera poi se il tuo codice è una libreria che viene utilizzata da persone terze che si trovano a utilizzare la tua interfaccia: se vedono un'asterisco nella dichiarazione del parametro della funzione sanno immediatamente cosa passare alla funzione, nell'altro caso sbaglieranno di sicuro, e il compilatore potrebbe non dirlo nemmeno.
Utilizzare il carattere
* non consuma + memoria se non per qualche decina di byte nel file sorgente, quindi esplicita sempre i puntatori do not typedef pointers ...