Il vantaggio c'è ed è anche consistente!
Guarda ad esempio questo codice:
struct EL
{
int dato;
struct EL *next;
};
typedef struct EL ElementoLista;
typedef ElementoLista *List;
/* funzione che stampa una lista */
void stampa_lista(List l)
{
while(l != NULL)
{
printf("%d\n", l->dato);
l = l->next;
}
}
/* funzione che inserisce un elemento in coda alla lista */
List ins_in_coda(List head, int elem)
{
...
}
...
Ho definito due nuovi tipi di dato: ElementoLista, che rappresenta una struct EL, e soprattutto Lista, che rappresenta un puntatore ad un elemento, cioè un puntatore ad una struct.
Poi, nel resto del codice, posso utilizzare semplicemente List, senza scrivere ogni volta "struct EL *". Diciamo che semplifica il codice e lo rende più leggibile.