questa costruisce una lista linkata e la ordina in maniera particolare


codice:
#include <stdio.h>
#include <math.h>
#include <malloc.h>
#include <stdlib.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() {
  int i;
   int z;
do{
   struct Lista *lst;
   struct Lista *ptr;


   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 */

   printf("quanti elementi vuoi inserire?");
   scanf("%d",&z);

   /* Popolo la lista con elementi casuali */

   for(i=0; i<z; 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<z; 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<z; i++) {
      printf("Elemento di posizione %d nella lista: %d\n", i, lst->dato);
      lst = lst->prossimo;
   }
                 }while(z!=0);
   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%2==0) {
            scambia(ptr, lst->prossimo);   /* Scambio i due elementi */
         }
         lst = lst->prossimo;
      }
      ptr = ptr->prossimo;
      lst = ptr;
   }
}