No se de donde habrás sacado ese código pero la sintaxis no es muy clara que digamos así que lo voy a cambiar para aumentar su legibilidad:
Código:
if(pi == 0)
{
pi = p;
}
else
{
pa->sig = p;
}
pa = p;
Ahora voy a tratar de explicarlo:
Si pi todavía no tiene valor es porque estamos agregando el primer nodo a la lista, entonces pi = p (el nodo que se está agregando). De lo contrario pa->sig es igual a p, con lo cual el nodo anterior apuntá al siguiente (p). Finalmente todas las veces se le asigna a pa p, con lo cual pa apunta al último nodo que se agregó.
El chiste de esto es que, a partir de pi->seg podemos rastrear todos los nodos:
Código:
nodo *next = next = pi->sig;
for (;;)
{
printf("%d\r\n", next->n);
if (!next->sig) { break; }
next = next->sig;
}