estoy intentando entender la memoria dinámica (pilas y colas) y no me está yendo muy bien, ufff...

struct nodo
{
short n;
struct nodo * sig;
}
struct nodo *p, *pa, *pi; //QUÉ SIGNIFICAN TODOS ESTOS PUNTEROS???
short aux;
void main (void)
{
printf("introduce numero o 0 para terminar:");
scanf("%d", &aux);
while(aux!=0)
{
p=(struct nodo *) malloc(sizeof(struct nodo)); //esto lo puedo entender, es la reserva de memoria
p->n=aux;
p->sig=0; //¿y este baile de punteros? S-(
if(pi==0)
pi=p;
else
pa->sig=p;
pa=p;
printf("introduce numero o 0 para terminar:");
scanf("%d", &aux);
func_clasificacion(); //No es más que una función para ordenar
}