Fondamenti di Informatica A - Massimo Bertozzi LE RAPPRESENTAZIONI CONCATENATE
Fondamenti di Informatica A - Massimo Bertozzi Array e prestazioni ✗ Un problema frequente del programmatore è la gestione di dati ordinati: ✗ Le operazioni da gestire sono: 1. ricerca elemento 2. inserzione nuovo elemento 3. cancellazione elemento ✗ Per i punti 2 e 3 l'utilizzo semplice di array porta a complessità computazionali di classe O(n) -> inefficiente
Fondamenti di Informatica A - Massimo Bertozzi Distribuzione in memoria dei dati ✗ Il problema fondamentale degli array è che i dati sono memorizzati sequenzialmente in memoria. ✗ ogni inserzione/cancellazione di un dato quando si desidera mantenere l'ordine necessita di uno spostamento dei dati ✗ Soluzione: dati non memorizzati sequenzialmente -> costrutti struct o class
Fondamenti di Informatica A - Massimo Bertozzi Preambolo: le strutture In C e C++ è possibile aggregare i dati scalari usando i tipi di dato composito: struct impiegato{ char *nome; char *cognome; int matricola; char posizione; }; // esistono altri modi di definire una struttura ✗ struct impiegato rappresenta un tipo di dato definito dal programmatore.
Fondamenti di Informatica A - Massimo Bertozzi Definizione e accesso ai dati ✗ La definizione di un nuovo tipo di dato permette di definire variabili relative a quel tipo: struct impiegato a, b[100], *c; ✗ L'accesso ai singoli componenti avviene tramite gli operatori. e -> a.matricola=123; b[10].cognome=new char[15]; c->matricola=a.matricola; cout matricola; cout << (*c).matricola; // sconsigliato struct impiegato d={“Mario”, “Rossi”, 03456, 'A'};
Fondamenti di Informatica A - Massimo Bertozzi Copia dati tra variabili struct ✗ La copia di dati tra variabili struct necessita qualche attenzione: struct impiegato a, b;... altro codice... b=a; // copio elementi struct delete[] a.nome; // elimino dati a e b! ✗ Per evitare questo problema: b=a; b.nome=new char[strlen(a.nome)+1]; strcpy(a.nome, b.nome); // etc.
Fondamenti di Informatica A - Massimo Bertozzi Strutture innestate ✗ È possibile creare strutture in cui uno o piú elementi sono a loro volta strutture: struct azienda{ struct impiegato *impiegati; struct operaio *operai; struct edificio b; } ✗ Le strutture non possono contenere istanze di se stesse
Fondamenti di Informatica A - Massimo Bertozzi Strutture autoreferenzianti ✗ Quando una struttura contiene uno o piú puntatori a se stessa si dice che si autoreferenzia: struct elenco{ char nome[100]; struct elenco *prossimo; }; ✗ Attenzione: non è possibile dichiarare puntatori a strutture non ancora definite!
Fondamenti di Informatica A - Massimo Bertozzi Rappresentazioni concatenate ✗ L'utilizzo di strutture autoreferenzianti permette la creazione di una famiglia di strutture dati che prendono il nome generale di rappresentazioni concatenate: ✗ liste o catene ✗ alberi ✗ grafi
Fondamenti di Informatica A - Massimo Bertozzi Bibliografia ✗ Un buon libro sulle rappresentazioni concatenate e in generale su algoritmi di ordinamento, ricerca, etc.: Sedgewick, Algorithms in C++ (Parts 1-4), Addison- Wesley, 1999; ✗ Per chi vuole approfondire: Donald E. Knuth, The Art of Computer Programming, Volumi 1-3, Addison-Wesley;
Fondamenti di Informatica A - Massimo Bertozzi Le liste ✗ Si definisce lista un insieme (eventualmente vuoto) di strutture dati (nodi o elementi) contenti: ✗ i dati ✗ l'indirizzo dell'elemento successivo ✗ La testa della lista è l'indirizzo che permette l'accesso al primo elemento
Fondamenti di Informatica A - Massimo Bertozzi Liste e array ✗ Al pari degli array le liste consentono la manipolazione di grandi quantità di dati. ✗ A differenza degli array questi dati non sono memorizzati consecutivamente in memoria: 123* Testa 16*0* *1986*123*0* 1986*
Fondamenti di Informatica A - Massimo Bertozzi Metodi ✗ Metodi: ✗ inserimento elemento; ✗ lettura elemento di indice k; ✗ eliminazione elemento di indice k; ✗ chiave di un elemento; ✗...
Fondamenti di Informatica A - Massimo Bertozzi Inserimento o cancellazione di nodi ✗ La non sequenzialità dei dati in memoria facilita estremamente la cancellazione e l'inserimento di dati [O(1)] ✗ Il recupero dei dati richiede però lo scorrimento della lista [O(n)] 16*0*1986*
Fondamenti di Informatica A - Massimo Bertozzi Le catene ✗ L'implementazione dei metodi delle liste è molto semplice se si sfrutta la ricorsione, in questo caso è pratico che l'ultimo elemento punti a NULL -> catena 123* Testa 16*0* NULL
Fondamenti di Informatica A - Massimo Bertozzi Altri tipi di liste ✗ Il concetto di lista può essere esteso a piacere: ✗ liste composite ✗ liste doppiamente concatenate ✗ liste circolari