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;
}
}