Prego. Magari un'ultima prova: forse gli da fastidio che usi (o meglio, modifichi) p (anche se non ha nessun senso): prova ad utilizzare un puntatore locale alla funzione, temporaneo, per fare la visita della lista, es.:
plist p2;
if(p==NULL)
return 0;
else
{
p2 = p;
while(1)
{
if(p2->next)
p2=p2->next;
else
break;
}
}