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"); } ```