Advertisement
Uncino

Stampa inversa

Mar 29th, 2025 (edited)
392
0
9 days
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.38 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. #define LISTELEM 10 // Numero di elementi nella lista
  5.  
  6. typedef struct stNodo   // E' solo un esperimento, quindi...
  7. {
  8.     struct stNodo * next;
  9.     int payload;
  10. } nodo;
  11.  
  12. nodo * lista;   // Testa della lista
  13.  
  14. // Creo la lista
  15. int fill(void)
  16. {
  17.     int i; // Variabile di ciclo
  18.     nodo * current; // Puntatore al nodo corrente
  19.     nodo * tmp; // Puntatore al nodo creato
  20.  
  21.     for ( i = 0; i < LISTELEM; i++)
  22.     {
  23.         tmp = (nodo *) malloc(sizeof(nodo));
  24.         if (tmp == NULL)
  25.         {
  26.             return -1;
  27.         }
  28.         tmp->next = NULL;
  29.         tmp->payload = i;
  30.         if (i == 0)
  31.         {
  32.             lista = tmp;
  33.             current = lista;
  34.         }
  35.         else
  36.         {
  37.             current->next = tmp;
  38.             current = tmp;
  39.         }
  40.     }
  41.     return 0;
  42. }
  43.  
  44. // Stampa la lista
  45. void stampa(void)
  46. {
  47.     nodo * n;
  48.  
  49.      for (n = lista; n != NULL; n = n->next)
  50.         printf("%d\n", n->payload);
  51. }
  52.  
  53. // Percorre la lista rovesciando i puntatori
  54. // Al termine lista punterà all'ultimo elemento della lista
  55. // In effetti questa funzione risolve l'intero problema in meno di 20 righe.
  56. void reverse(void)
  57. {
  58.     nodo * current;
  59.     nodo * prev; // Alle fine del ciclo di inversione punterà all'ultimo elemento della lista
  60.     nodo * next;
  61.  
  62.     // Percorro la lista fino alla fine invertendo i puntatori
  63.     current = lista;
  64.     prev = NULL;
  65.     while (current != NULL)
  66.     {
  67.         printf("%d\n", current->payload);
  68.  
  69.         next = current->next;  // Salvo il nodo successivo
  70.         current->next = prev;  // Inverto il puntatore
  71.         prev = current;        // Aggiorno prev
  72.         current = next;        // E current diventa il nodo salvato
  73.     }
  74.     lista = prev; // Al termine faccio puntare la testa della lista sll'ultimo elemento (che adesso è il primo)
  75. }
  76.  
  77. int main(void)
  78. {
  79.     int res;
  80.  
  81.     res = fill();
  82.     if (res == -1)
  83.     {
  84.         return -1;
  85.     }
  86.     printf("La prima chiamata a reverse percorrerà la lista originale, stampandola in ordine diretto ed invertendola\n\n");
  87.     reverse();
  88.     printf("La seconda la percorrerà dalla coda verso la testa, stampandola in ordine inverso ed invertendola nuovamente \n\n");
  89.     reverse();
  90.     printf("Chiamo la funzione di stampa per verificare che tutto sia tornato in ordine.\n");
  91.     stampa();
  92.  
  93.     return 0;
  94. }
  95.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement