Il problema è che qua:

codice:
while(aux!=NULL){
                      if(p->val>aux->val){
                                          valore=p->val;
                                          p->val=aux->val;
                                          aux->val=valore;
                                          }
Scorri la lista una sola volta.
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.