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

Rispondi quotando