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.