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;
   }
}