#include #include #define LISTELEM 10 // Numero di elementi nella lista typedef struct stNodo // E' solo un esperimento, quindi... { struct stNodo * next; int payload; } nodo; nodo * lista; // Testa della lista // Creo la lista int fill(void) { int i; // Variabile di ciclo nodo * current; // Puntatore al nodo corrente nodo * tmp; // Puntatore al nodo creato for ( i = 0; i < LISTELEM; i++) { tmp = (nodo *) malloc(sizeof(nodo)); if (tmp == NULL) { return -1; } tmp->next = NULL; tmp->payload = i; if (i == 0) { lista = tmp; current = lista; } else { current->next = tmp; current = tmp; } } return 0; } // Stampa la lista void stampa(void) { nodo * n; for (n = lista; n != NULL; n = n->next) printf("%d\n", n->payload); } // Percorre la lista rovesciando i puntatori // Al termine lista punterà all'ultimo elemento della lista // In effetti questa funzione risolve l'intero problema in meno di 20 righe. void reverse(void) { nodo * current; nodo * prev; // Alle fine del ciclo di inversione punterà all'ultimo elemento della lista nodo * next; // Percorro la lista fino alla fine invertendo i puntatori current = lista; prev = NULL; while (current != NULL) { printf("%d\n", current->payload); next = current->next; // Salvo il nodo successivo current->next = prev; // Inverto il puntatore prev = current; // Aggiorno prev current = next; // E current diventa il nodo salvato } lista = prev; // Al termine faccio puntare la testa della lista sll'ultimo elemento (che adesso è il primo) } int main(void) { int res; res = fill(); if (res == -1) { return -1; } printf("La prima chiamata a reverse percorrerà la lista originale, stampandola in ordine diretto ed invertendola\n\n"); reverse(); printf("La seconda la percorrerà dalla coda verso la testa, stampandola in ordine inverso ed invertendola nuovamente \n\n"); reverse(); printf("Chiamo la funzione di stampa per verificare che tutto sia tornato in ordine.\n"); stampa(); return 0; }