Ho appena realizzato questo semplice esempio: c'è l'implementazione della lista linkata ed il programma la usa per creare una ilsta con 10 nodi con valori casuali, poi la ordina.
codice:
#include <stdio.h>

/* Implementazione della lista Linkata */
struct Lista {
   int dato;                 /* Dato contenuto in questo nodo */
   struct Lista* prossimo;   /* Link al prossimo elemento */
};

/* Questa procedura si occupa di inserire un elemento in un nodo
 * e di creare il nodo successivo, senza doverlo fare a manina
 * per tutti e 10 gli elementi
 */
void creaElemento(struct Lista *lst, int d) {
   lst->dato = d;
   lst->prossimo = (struct Lista*) malloc(sizeof(struct Lista));
   lst->prossimo->dato = -1;   /* Così so che quifinisce la lista */
}

void ordinaLista(struct Lista *lst);                /* Implementata dopo */
void scambia(struct Lista *l1, struct Lista *l2);   /* Implementata dopo */

int main() {
   struct Lista *lst;
   struct Lista *ptr;
   int i;
   
   srand(time(NULL));   /* Inizializzo il seme del generatore di numeri casuali */
   lst = (struct Lista*) malloc(sizeof(struct Lista));   /* Alloco la lista (1° elemento) */
   ptr = lst;   /* Memorizzo il puntatore */
   
   /* Popolo la lista con elementi casuali */
   for(i=0; i<10; i++) {
      creaElemento(lst, rand());
      lst = lst->prossimo;
   }
   
   lst = ptr;   /* Riposiziono il puntatore */
   
   /* Stampo la lista non ordinata */
   printf("Lista disordinata:\n");
   for (i=0; i<10; i++) {
      printf("Elemento di posizione %d nella lista: %d\n", i, lst->dato);
      lst = lst->prossimo;
   }
   
   lst = ptr;   /* Riposiziono il puntatore */
   
   ordinaLista(lst);   /* Ordino la lista */

   /* Stampo la lista che ora è ordinata */
   printf("\n\nLista ordinata:\n");
   for (i=0; i<10; i++) {
      printf("Elemento di posizione %d nella lista: %d\n", i, lst->dato);
      lst = lst->prossimo;
   }

   return 0;
}

void scambia(struct Lista *l1, struct Lista *l2) {
   int datoTmp;   /* Dato temporaneo */
   datoTmp = l1->dato;
   l1->dato = l2->dato;
   l2->dato = datoTmp;
}

void ordinaLista(struct Lista *lst) {
   struct Lista *ptr = lst;    /* Memorizzo l'indirizzo */
   struct Lista *prec = lst;   /* Devo memorizzare il puntatore al valore precedente */
   
   while(lst->prossimo->dato > 0) {   /* Fino alla fine della lista */
      while (lst->prossimo->dato > 0) {   /* Fino alla fine della lista */
         if (ptr->dato > lst->prossimo->dato) {
            scambia(ptr, lst->prossimo);   /* Scambio i due elementi */
         }
         lst = lst->prossimo;
      }
      ptr = ptr->prossimo;
      lst = ptr;
   }
}