Linguaggio C++

Collegare Nodi

Esercitazione pratica sui nodi in C++: come creare e collegare nodi tra loro per rappresentare una fila di pazienti in attesa.

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.


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 pazienti
  • void 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.