In questa lezione applicheremo il concetto di nodo a un problema reale: gestire una fila di pazienti in un ambulatorio. Ogni paziente è rappresentato da un nodo, e i nodi vengono collegati tra loro per formare una lista dinamica.
Questo laboratorio ti farà capire perché le strutture dinamiche sono utili: la fila può crescere o ridursi senza sapere prima quanti pazienti ci saranno.
1️⃣ Modellazione del problema
Ogni paziente ha un nome e un codice di priorità (più alto = maggiore urgenza).
La fila è formata da una serie di nodi collegati, ognuno con un next che punta al paziente successivo.
struct Paziente {
string nome;
int priorita;
Paziente* next;
};
2️⃣ Creazione e collegamento di nodi
Iniziamo creando tre pazienti e collegandoli manualmente:
#include <iostream>
using namespace std;
struct Paziente {
string nome;
int priorita;
Paziente* next;
};
int main() {
Paziente* p1 = new Paziente{"Anna", 2, nullptr};
Paziente* p2 = new Paziente{"Luca", 4, nullptr};
Paziente* p3 = new Paziente{"Sara", 3, nullptr};
// Collegamento dei nodi
p1->next = p2;
p2->next = p3;
p3->next = nullptr;
// Stampa della lista
Paziente* p = p1;
cout << "Lista pazienti:" << endl;
while (p != nullptr) {
cout << p->nome << " (priorità " << p->priorita << ")" << endl;
p = p->next;
}
delete p1; delete p2; delete p3;
}
✅ Output:
Lista pazienti:
Anna (priorità 2)
Luca (priorità 4)
Sara (priorità 3)
3️⃣ Come sono collegati in memoria
Visualmente la memoria è così:
[p1] ──► [Anna | • ] ──► [Luca | • ] ──► [Sara | nullptr] Ogni nodo è un Paziente: • prima parte: dati • seconda parte: puntatore al prossimo nodo
Questo è il cuore delle liste concatenate.
4️⃣ Inserimento dinamico di un nuovo paziente
Con new possiamo aggiungere un nuovo nodo collegandolo all’ultimo:
Paziente* nuovo = new Paziente{"Giulia", 5, nullptr};
p3->next = nuovo; // collego il precedente all ultimo
// Stampa aggiornata
p = p1;
cout << "\nDopo inserimento:" << endl;
while (p != nullptr) {
cout << p->nome << " (priorità " << p->priorita << ")" << endl;
p = p->next;
}
✅ Ora la lista contiene 4 pazienti, e il nuovo è stato aggiunto in fondo.
5️⃣ Scorrere e contare i nodi
Possiamo scrivere una funzione per contare i pazienti nella lista:
int conta(Paziente* testa) {
int c = 0;
while (testa != nullptr) {
c++;
testa = testa->next;
}
return c;
}
Nel main:
cout << "\nTotale pazienti: " << conta(p1) << endl;
6️⃣ Deallocazione corretta
Ogni nodo è stato creato con new, quindi deve essere liberato con delete per evitare memory leak.
Paziente* temp;
p = p1;
while (p != nullptr) {
temp = p;
p = p->next;
delete temp;
}
p1 = nullptr;
👉 Dopo questo ciclo, tutti i nodi sono stati eliminati correttamente.
7️⃣ Variante: inserimento in testa
Spesso nelle liste serve aggiungere un nuovo nodo davanti al primo:
void inserisciInTesta(Paziente*& testa, string nome, int priorita) {
Paziente* nuovo = new Paziente{nome, priorita, testa};
testa = nuovo;
}
Nel main:
inserisciInTesta(p1, "Mario", 1); // aggiunge in testa
Ora la lista inizia da "Mario" e prosegue con gli altri.
LABORATORIO
Collegare Nodi tra loro: la fila dei pazienti
In questo laboratorio creerai e collegherai nodi per rappresentare una fila di pazienti in attesa. Imparerai a gestire dinamicamente i collegamenti e ad aggiungere nuovi elementi alla lista.
- Ambiente C++ (Code::Blocks, Dev-C++ o Visual Studio Code)
- Console per inserire e visualizzare i dati
1 Definizione del nodo
Crea la struct Paziente con campi nome, priorita e Paziente* next.
2 Creazione manuale
Crea 3 pazienti con new e collegali con i puntatori. Stampa la lista.
3 Inserimento dinamico
Chiedi all utente nome e priorità di un nuovo paziente, crea un nuovo nodo e aggiungilo in coda.
4 Funzioni di gestione
int conta(Paziente* testa)→ restituisce il numero di pazientivoid inserisciInTesta(Paziente*& testa, string nome, int priorita)void stampa(Paziente* testa)→ scorre e stampa la lista
5 Deallocazione finale
Libera tutti i nodi con un ciclo while e delete per ogni nodo.
6 Estensioni
- Aggiungi una funzione che trova il paziente con la priorità più alta.
- Permetti di inserire un nuovo paziente ordinato per priorità (non solo in coda).
- Mostra a video gli indirizzi dei nodi per visualizzare i collegamenti in memoria.