Liste concatenate

Note

Le liste concatenate sono strutture dati dinamiche composte da nodi collegati tra loro tramite puntatori.
Ogni nodo contiene due elementi:

  • Dati (informazioni memorizzate)
  • Puntatore al nodo successivo nella lista

Le operazioni fondamentali sulle liste sono:

  • Inserimento (all'inizio, alla fine o in una posizione specifica)
  • Cancellazione di un nodo
  • Ricerca di un valore
  • Visualizzazione dell'intera lista
Example
#include <stdio.h>
#include <stdlib.h>

/* Definizione della struttura del nodo */
typedef struct Nodo {
   int dato;
   struct Nodo* prossimo;
} Nodo;

/* Funzione per creare un nuovo nodo */
Nodo* creaNodo(int valore) {
   Nodo* nuovo = (Nodo*)malloc(sizeof(Nodo));
   if (nuovo == NULL) {
       printf("Errore di allocazione!\n");
       return NULL;
   }
   nuovo->dato = valore;
   nuovo->prossimo = NULL;
   return nuovo;
}

Inserimento di un Nodo

Note

Un nuovo nodo può essere inserito in diverse posizioni:

  • All'inizio (testa)
  • Alla fine (coda)
  • Dopo un nodo specifico
Example
/* Inserimento all'inizio */
void inserisciInTesta(Nodo** testa, int valore) {
   Nodo* nuovo = creaNodo(valore);
   if (nuovo == NULL) return;
   nuovo->prossimo = *testa;
   *testa = nuovo;
}

/* Inserimento alla fine */
void inserisciInCoda(Nodo** testa, int valore) {
   Nodo* nuovo = creaNodo(valore);
   if (nuovo == NULL) return;

   if (*testa == NULL) {
       *testa = nuovo;
       return;
   }

   Nodo* temp = *testa;
   while (temp->prossimo != NULL) {
       temp = temp->prossimo;
   }
   temp->prossimo = nuovo;
}

Eliminazione di un Nodo

Note

La rimozione di un nodo può avvenire in tre casi principali:

  • Rimozione dalla testa
  • Rimozione da una posizione specifica
  • Rimozione dalla coda
Example
/* Eliminazione di un nodo con un valore specifico */
void eliminaNodo(Nodo** testa, int valore) {
   Nodo* temp = *testa;
   Nodo* precedente = NULL;

   /* Se il nodo da eliminare è la testa */
   if (temp != NULL && temp->dato == valore) {
       *testa = temp->prossimo;
       free(temp);
       return;
   }

   /* Cerca il nodo da eliminare */
   while (temp != NULL && temp->dato != valore) {
       precedente = temp;
       temp = temp->prossimo;
   }

   /* Se il valore non è nella lista */
   if (temp == NULL) return;

   /* Rimuove il nodo */
   precedente->prossimo = temp->prossimo;
   free(temp);
}

Stampa della Lista

Example
/* Funzione per stampare la lista */
void stampaLista(Nodo* testa) {
   Nodo* temp = testa;
   while (temp != NULL) {
       printf("%d -> ", temp->dato);
       temp = temp->prossimo;
   }
   printf("NULL\n");
}