Stavi assegnando valore che è un intero, a temp che è un puntatore.
Poi ho sostituito temp=aux con temp=p perchè in effetti stavo considerando solo la parte finale della lista.Per capirlo fai finta che è uguale a un vettore, dove temp e temp->succ sono adiacenti in memoria (anche se in realtà non è così).
Allora stai confrontando due elementi adiacenti del vettore.Se l' elemento i-esimo è maggiore dell' elemento (i+1)-esimo li scambi.
codice:
void ordine(struct elemento *p)
{
     int valore;
     struct elemento *aux,*temp;
     aux=p;
     while(aux->succ!=NULL){
                            temp=p;
                            while(temp->succ!=NULL){
                                                    if(temp->val>temp->succ->val){
                                                                        valore=temp->val;
                                                                        temp->val=valore;
                                                                        temp->succ->val=valore;
                                                                        }
                                                        temp=temp->succ;  
                                                    }
                            aux=aux->succ;
                           }
Eidt: Altra cosa,il confronto va fatto sui valori (il campo val), non sui puntatori.Così stai solo confrontando due indirizzi.Il che non ha senso.
Poi temp va scorso fuori dall' if, altrimenti lo scorri solo se il temp->val è maggiore di temp->succ->val.
Così dovrebbe essere ok, almeno spero.Dimmi se funziona