Il problema è che qua:
Scorri la lista una sola volta.codice:while(aux!=NULL){ if(p->val>aux->val){ valore=p->val; p->val=aux->val; aux->val=valore; }
Se i valori sono [3,2,1], al primo confronto trascini il tre in seconda posizione e diventa:
[2,3,1]
Al secondo confronto trascini il tre in terza posizione e diventa:
[2,1,3]
Poi aux diventa NULL e si esce dal while.
Hai bisogno di fare più confronti, se non vuoi badare all' efficienza puoi fare N^2 confronti (cioè scorri la lista N volte).
Anche se in realtà lo potresti fare più efficientemente.Ma intanto ti suggerisco di fare la versione che non si preoccupa dell' efficienza, giusto per capire come funziona.