12/01/2004 Programmazione Procedurale in Linguaggio C++ Strutture di Dati Parte 6 Dettagli e Approfondimenti versione 2.0 Questo lavoro è concesso in uso secondo i termini di una licenza Creative Commons (vedi ultima pagina) G. Mecca – Università della Basilicata – [email protected] Strutture di Dati: Approfondimenti >> Sommario Sommario m Ricapitolazione m Tipi Speciali di Liste m La Pila G. Mecca - Programmazione Procedurale in Linguaggio C++ 2 1 12/01/2004 Strutture di Dati: Approfondimenti >> Ricapitolazione Ricapitolazione m Passi per la soluzione di un problema ðanalisi delle specifiche (dati di ingresso e uscita, eliminazione delle ambiguità) ðscelta dell’algoritmo ðscrittura del codice ðcompilazione ðtest G. Mecca - Programmazione Procedurale in Linguaggio C++ 3 Strutture di Dati: Approfondimenti >> Ricapitolazione Ricapitolazione m Scelta dell’algoritmo ðstrategia di rappresentazione dei dati ðstrategia di operazioni sui dati ðla prima influisce sulla seconda m Strategia di rappresentazione dei dati ðscelta della struttura di dati ðstruttura in memoria delle variabili per rappresentare i dati del problema G. Mecca - Programmazione Procedurale in Linguaggio C++ 4 2 12/01/2004 Strutture di Dati: Approfondimenti >> Ricapitolazione Ricapitolazione m Strutture di dati notevoli ðesistono strutture di dati ricorrenti m Esempi ðgli insiemi di elementi ðle liste di elementi ðle matrici di elementi m Per queste strutture di dati ðesistono rappresentazioni “canoniche” G. Mecca - Programmazione Procedurale in Linguaggio C++ 5 Strutture di Dati: Approfondimenti >> Ricapitolazione Ricapitolazione m Rappresentazione canonica ðinsieme di tipi per definire le variabili della struttura di dati ðinsieme di sottoprogrammi per manipolare la struttura di dati ðsperimentate e notoriamente corrette ðper una stessa struttura di dati possono esistere rappresentazioni differenti G. Mecca - Programmazione Procedurale in Linguaggio C++ 6 3 12/01/2004 Strutture di Dati: Approfondimenti >> Ricapitolazione Ricapitolazione m Esempio: la lista ðrappresentazione con array e indicatore di riempimento ðla lista è un record con due componenti ðgli elementi sono contenuti nelle variabili di un array ðviene usata una variabile intera per tenere traccia del livello di riempimento dell’array 7 G. Mecca - Programmazione Procedurale in Linguaggio C++ Strutture di Dati: Approfondimenti >> Ricapitolazione Rappresentazione con Record e Array const int MAXDIM=100; struct lista { int indicatore; float valori[MAXDIM]; }; void main() { lista l; ... } #99 xxx #100 l.indicatore xxx #101 l.valori #102 #102 l.valori[0] xxx l.valori[1] xxx l.valori[2] xxx #105 l.valori[3] xxx #106 l.valori[4] xxx ... ... ... #201 l.valori[99] xxx #103 #104 l #202 G. Mecca - Programmazione Procedurale in Linguaggio C++ xxx 8 4 12/01/2004 Strutture di Dati: Approfondimenti >> Ricapitolazione Ricapitolazione m Indicatore di riempimento ðpuò assumere valori compresi tra 0 e MAXDIM ðse vale 0, la lista è vuota ðse vale MAXDIM, la lista è completam. piena ðin ogni momento, il numero di componenti utilizzate dell’array corrisponde al valore dell’indicatore ðdeve essere manipolato con attenzione 9 G. Mecca - Programmazione Procedurale in Linguaggio C++ Strutture di Dati: Approfondimenti >> Ricapitolazione Ricapitolazione m Operazioni sulla lista ðnelle operazioni, è necessario tenere in conto vari aspetti m Problema n.1 ðgestire correttamente il valore dell’indicatore di riempimento (incrementi e diminuzioni) m Problema n.2 ðverificare la correttezza delle operazioni (lista vuota, lista piena, posizioni corrette ecc.) G. Mecca - Programmazione Procedurale in Linguaggio C++ 10 5 12/01/2004 Strutture di Dati: Approfondimenti >> Ricapitolazione Operazioni sulla Lista void void void void void leggi (lista &l); leggiIndicatore (int &indicatore); stampa (lista l); salvaSuDisco (lista l, string nomeFile); carica (lista &l, string nomeFile); void aggiungiInCoda (lista &l, float elem, bool& esito); void aggiungiInPosizione (lista &l, float elem, int pos, bool& esito); void eliminaInCoda (lista &l, bool& esito); void eliminaInPosizione (lista &l, int pos, bool& esito); int cercaPosizione (lista l, float elem); bool posizioneEsistente (lista l, int pos); G. Mecca - Programmazione Procedurale in Linguaggio C++ 11 Strutture di Dati: Approfondimenti >> Ricapitolazione Ricapitolazione m Inserimenti in posizione i ðse i è “in mezzo” alla lista, tutte le componenti successive alla posizione in cui inserire devono essere spostate in basso m Cancellazione in posizione i ðse i è in mezzo alla lista, tutti le componenti successive alla posizione in cui cancellare devono essere spostate in alto G. Mecca - Programmazione Procedurale in Linguaggio C++ 12 6 12/01/2004 Strutture di Dati: Approfondimenti >> Ricapitolazione Ricapitolazione m Lista di record ðsi applica lo stesso principio m Esempio struct studente { int matricola; string cognome, nome; int annoCorso; }; const int N=100; struct listaStudenti { int indicatore; studente dati[N]; }; G. Mecca - Programmazione Procedurale in Linguaggio C++ 13 Tipi Strutturati: Dettagli e Approfondimenti >> Ricapitolazione Domande ed Esercizi di Riepilogo G. Mecca - Programmazione Procedurale in Linguaggio C++ 14 7 12/01/2004 Strutture di Dati: Approfondimenti >> Tipi Speciali di Liste Tipi Speciali di Liste m In alcuni casi ðle applicazioni richiedono liste utilizzate in modi particolari ðle operazioni sono scritte ed utilizzate in modo particolare ðes: liste ordinate m Due categorie di liste importanti ðcode ðpile G. Mecca - Programmazione Procedurale in Linguaggio C++ 15 Strutture di Dati: Approfondimenti >> Tipi Speciali di Liste Tipi Speciali di Liste m Code ðliste in cui gli elementi devono essere estratti nello stesso ordine in cui sono stati inseriti ðtipicamente utilizzate per gestire richieste di servizio m Esempio ðcoda delle richieste ad un sito Web (le richieste devono essere servite nell’ordine in cui sono arrivate) G. Mecca - Programmazione Procedurale in Linguaggio C++ 16 8 12/01/2004 Strutture di Dati: Approfondimenti >> Tipi Speciali di Liste Tipi Speciali di Liste m In una coda ðl’inserimento: arrivo di una nuova richiesta ðcancellazione: soddisfacimento di una richiesta m Cosa cambia in una coda ðbisogna rispettare l’ordine di arrivo ðgli inserimenti si fanno solo in coda ðle eliminazioni si fanno solo in testa ðstrategia FIFO (“first in, first out”) G. Mecca - Programmazione Procedurale in Linguaggio C++ 17 Strutture di Dati: Approfondimenti >> Tipi Speciali di Liste Tipi Speciali di Liste m Inserim. e cancellaz. in una lista generica ðinizialmente: lista vuota <> ðinserisco 5 in coda: <5> ðinserisco 7 in coda: <5, 7> ðinserisco 4 in pos. 1: <5, 4, 7> ðinserisco 9 in pos. 0 (in testa): <9, 5, 4, 7> ðcancello in pos. 2: <9, 5, 7> G. Mecca - Programmazione Procedurale in Linguaggio C++ 18 9 12/01/2004 Strutture di Dati: Approfondimenti >> Tipi Speciali di Liste Tipi Speciali di Liste m Es: inserim. e cancellazioni in una coda ðinizialmente: coda vuota <> ðinserisco 5 (in coda): <5> ðinserisco 7 (in coda): <5, 7> ðinserisco 4 (in coda): <5, 7, 4> ðestraggo (5): <7, 4> ðinserisco 9 (in coda): <7, 4, 9> ðestraggo (7): <4, 9> G. Mecca - Programmazione Procedurale in Linguaggio C++ 19 Strutture di Dati: Approfondimenti >> La Pila La Pila m Pile ðliste in cui gli elementi devono essere estratti in ordine inverso rispetto a quello in cui sono stati inseriti m Analogia ðla pila di piatti (o di libri) ði piatti devono essere riposti nello stesso ordine in cui sono stati impilati G. Mecca - Programmazione Procedurale in Linguaggio C++ 20 10 12/01/2004 Strutture di Dati: Approfondimenti >> La Pila La Pila m Strategia ðLIFO (“last in, first out”) ðl’ultimo arrivato è il primo che viene prelevato ðinserimenti e cancellazioni avvengono solo da un estremo m Terminologia ðinserimento di un elemento: push ðeliminazione di un elemento: pop 21 G. Mecca - Programmazione Procedurale in Linguaggio C++ Strutture di Dati: Approfondimenti >> Tipi Speciali di Liste Tipi Speciali di Liste m Es: inserim. e cancellazioni in una pila ðinizialmente: pila vuota <> ðinserisco 5: <5> 5 5 5 ðinserisco 7: <5, 7> 7 ðestraggo (7): <5> ðinserisco 4: <5, 4> ðinserisco 9: <5, 4, 9> ðestraggo (9): <5, 4> “elemento affiorante” ðestraggo (4): <5> G. Mecca - Programmazione Procedurale in Linguaggio C++ 5 5 5 4 4 4 5 9 22 11 12/01/2004 Strutture di Dati: Approfondimenti >> La Pila La Pila m Operazioni sulla pila ðpush(x, p): inserisci l’elemento x nella pila ðpop(x): estrae l’”elemento affiorante” della pila ðtop(p): restituisce il valore dell’elemento affiorante della pila ðinit(p): inizializza la pila p in modo che sia vuota ðempty(p): restituisce true se la pila è vuota G. Mecca - Programmazione Procedurale in Linguaggio C++ 23 Strutture di Dati: Approfondimenti >> La Pila La Pila m Attenzione ðsi tratta di una lista ordinaria ðcon un numero limitato di operazioni possibili ðe con nomi particolari m In particolare ðpush: inserimento in coda ðpop: eliminazione in coda ðtop: valore dell’ultimo elemento G. Mecca - Programmazione Procedurale in Linguaggio C++ 24 12 12/01/2004 Strutture di Dati: Approfondimenti >> La Pila La Pila mA che servono le pile ? ðservono nei casi in cui in un programma è necessario poter “tornare sui propri passi” ðripercorrendo gli stessi passi in ordine inverso m Esempio ð“operazione annulla” (“undo”) in un programma di elaborazione di testi G. Mecca - Programmazione Procedurale in Linguaggio C++ 25 Strutture di Dati: Approfondimenti >> La Pila La Pila m Un altro esempio ðil browser Web e i tasti “indietro” e “avanti” ðil browser mantiene traccia della sequenza delle pagine visitate ðe consente di ritornare indietro alle pagine precedenti oppure avanti alle successive m Per farlo: due pile ðpila delle pagine precedenti ðpila delle pagine successive G. Mecca - Programmazione Procedurale in Linguaggio C++ 26 13 12/01/2004 Strutture di Dati: Approfondimenti >> La Pila La Pila m >> browser1.cpp >> paginaWeb1.h >> pilaDiStringhe1.h Esempio ðun browser semplificato per pagine testuali ðconsente di “navigare” semplici pagine testuali ðciascuna pagina ha un titolo ðe contiene una lista di collegamenti ad altre pagine ðil browser richiede un indirizzo iniziale ðe poi consente di seguire i collegamenti nelle pagine ðconsentendo anche di andare avanti e indietro G. Mecca - Programmazione Procedurale in Linguaggio C++ 27 Strutture di Dati: Approfondimenti >> La Pila La Pila m Gestione delle pagine Web ðpaginaWeb1.cpp: una libreria per la lettura e la navigazione di semplici pagine testuali m Gestione della pila ðpilaDiStringhe1.cpp: una libreria per la gestione di pile di stringhe ðnon c’è niente di nuovo. si tratta di una libreria semplificata per la gestione di liste di stringhe G. Mecca - Programmazione Procedurale in Linguaggio C++ 28 14 12/01/2004 Strutture di Dati: Approfondimenti >> La Pila La Pila >> browser2.cpp >> listaDiStringhe1.h m Infatti ðè possibile scrivere il programma utilizzando direttamente una libreria per la gestione di liste di stringhe ðpurchè vengano utilizzate solo le operazioni consentite sulle pile ðcioè venga rispettata la strategia LIFO G. Mecca - Programmazione Procedurale in Linguaggio C++ 29 Strutture di Dati: Approfondimenti >> Sommario Riassumendo m Ricapitolazione m Tipi Speciali di Liste m La Pila G. Mecca - Programmazione Procedurale in Linguaggio C++ 30 15 12/01/2004 Termini della Licenza Termini della Licenza m This work is licensed under the Creative Commons AttributionShareAlike License. To view a copy of this license, visit http://creativecommons.org/licenses/by-sa/1.0/ or send a letter to Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA. m Questo lavoro viene concesso in uso secondo i termini della licenza “Attribution-ShareAlike” di Creative Commons. Per ottenere una copia della licenza, è possibile visitare http://creativecommons.org/licenses/by-sa/1.0/ oppure inviare una lettera all’indirizzo Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA. G. Mecca - Programmazione Procedurale in Linguaggio C++ 31 16