obiettivi di questa seconda metà del corso fare un passo avanti rispetto a :... meccanismi di composizione dei dati



Documenti analoghi
Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2

Laboratorio di Algoritmi e Strutture Dati

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2

Corso di Fondamenti di Informatica II

SOMMARIO Coda (queue): QUEUE. QUEUE : specifica QUEUE

Sottoprogrammi: astrazione procedurale

La struttura dati ad albero binario

Le Liste. Elisa Marengo. Università degli Studi di Torino Dipartimento di Informatica. Elisa Marengo (UNITO) Le Liste 1 / 31

Corso di Fondamenti di Informatica Algoritmi su array / 2

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2

Algoritmi su array / 2

Informatica 3. Informatica 3. LEZIONE 12: Liste. Lezione 12 - Modulo 1. Posizione corrente. Introduzione

Laboratorio di Algoritmi e Strutture Dati

Gestione dinamica di una pila

LISTE, INSIEMI, ALBERI E RICORSIONE

Corso di Laurea in Ingegneria Gestionale Esame di Informatica a.a settembre 2011

Uso di JUnit. Fondamenti di informatica Oggetti e Java. JUnit. Luca Cabibbo. ottobre 2012

Algoritmi e Strutture Dati & Laboratorio di Algoritmi e Programmazione

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica

Tipi primitivi. Ad esempio, il codice seguente dichiara una variabile di tipo intero, le assegna il valore 5 e stampa a schermo il suo contenuto:

Algoritmi di Ricerca. Esempi di programmi Java

Una funzione è detta ricorsiva se chiama, direttamente o indirettamente, se stessa. In C tutte le funzioni possono essere usate ricorsivamente.

Visibilità dei Membri di una Classe

Realizzazione di una classe con un associazione

Calcolare il massimo di una lista

Compito di Fondamenti di Informatica

Inizializzazione, Assegnamento e Distruzione di Classi

I tipi di dato astratti

Il tipo di dato astratto Pila

Corso di Laurea in Ingegneria Gestionale Esame di Informatica a.a I scritto Febbraio 11 Febbraio 2011

Esercitazione 6. Tutor: Ing. Diego Rughetti. Anno Accademico 2007/2008

Algoritmi e Strutture Dati

I file di dati. Unità didattica D1 1

Algoritmi e Strutture Dati. Tipo di dato astratto e Strutture dati elementari

1: /* Nome del programma: gestione_articoli_01.cpp 2: Realizzato da: Gaetano Della Cerra 3: Data: 06/02/ III Informatica Serale I.T.I.S.

Esempi di esercizi d esame

Definizione di classi con array di oggetti

costruttori e distruttori

Laboratorio di Calcolatori 1 Corso di Laurea in Fisica A.A. 2006/2007

GESTIONE INFORMATICA DEI DATI AZIENDALI

BOZZA. cin per la comunicazione dal dispositivo di input standard, la tastiera, al programma (stream di input standard)

Algebra di Boole: Concetti di base. Fondamenti di Informatica - D. Talia - UNICAL 1. Fondamenti di Informatica

SAPIENZA Università di Roma Facoltà di Ingegneria dell Informazione, Informatica e Statistica

Esempio: dest = parolagigante, lettere = PROVA dest (dopo l'invocazione di tipo pari ) = pprrlogvgante

Introduzione alla programmazione in C

Laboratorio di Programmazione II Corso di Laurea in Bioinformatica Dipartimento di Informatica - Università di Verona

QUEUE : considerazioni. QUEUE : considerazioni. QUEUE : esempio. QUEUE : esempio

Soluzioni degli esercizi di riepilogo (Fondamenti di Informatica 1 Walter Didimo)

Corso di Informatica Corso di Laurea in Ingegneria Gestionale a.a Secondo Compitino 17 Dicembre 2005

COMPITO DI LABORATORIO DI PROGRAMMAZIONE Luglio Soluzione degli Esercizi

/** * VETTORE DINAMICO elementi */ private Vector elementi; /** * METODO COSTRUTTORE */ public coda() { elementi=new Vector(); }

Fondamenti di Informatica 2

Laboratorio di programmazione

Programmazione 1 A.A. 2015/2016

Appunti tratti dal videocorso on-line di Algoritmi e Programmazione Avanzata By ALeXio

Programmazione ad Oggetti Modulo A (Esame del 11/9/2015)

(Esercizi Tratti da Temi d esame degli ordinamenti precedenti)

PROGRAMMA SVOLTO DI INFORMATICA ANNO SCOLASTICO 2013/2014. DOCENTE: Villani Chiara

12 - Introduzione alla Programmazione Orientata agli Oggetti (Object Oriented Programming OOP)

Esercizi sulla definizione di classi (Fondamenti di Informatica 1 Walter Didimo) Soluzioni

3. La sintassi di Java

Università degli Studi di Cassino Corso di Fondamenti di Informatica Puntatori. Anno Accademico 2010/2011 Francesco Tortorella

Utilizzo e scrittura di classi

dall argomento argomento della malloc()

INFORMATICA GRAFICA - FONDAMENTI DI INFORMATICA Ing. Civile - Edile/Architettura Dott. Penzo SOLUZIONE PROVA SCRITTA DEL 16/09/2002.

10 - Programmare con gli Array

Studente (Cognome Nome): Corso di Informatica Corso di Laurea in Ingegneria Gestionale a.a Secondo Compitino 21 Dicembre 2006

13 - Gestione della Memoria nella Programmazione Orientata agli Oggetti

Strutture. Strutture e Unioni. Definizione di strutture (2) Definizione di strutture (1)

Studente (Cognome Nome): Corso di Informatica Corso di Laurea in Ingegneria Gestionale a.a Primo scritto 11 Gennaio 2008

COGNOME E NOME (IN STAMPATELLO) MATRICOLA

Laboratorio di Algoritmi e Strutture Dati

Matematica in laboratorio

Per scrivere una procedura che non deve restituire nessun valore e deve solo contenere le informazioni per le modalità delle porte e controlli

Parcheggio.rtf 1/8 6 gennaio Prova di programmazione: parcheggio a pagamento

Programmazione Orientata agli Oggetti in Linguaggio Java

Chat. Si ha un server in ascolto sulla porta Quando un client richiede la connessione, il server risponde con: Connessione accettata.

void funzioneprova() { int x=2; cout<<"dentro la funzione x="<<x<<endl; }

Soluzione dell esercizio del 2 Febbraio 2004

Prossime lezioni. Dai TDA agli oggetti. Riassunto. Riassunto TDA. Oggi. Stefano Mizzaro 1

Corso di Fondamenti di Informatica

Linguaggi Corso M-Z - Laurea in Ingegneria Informatica A.A Esercitazione. Programmazione Object Oriented in Java

Regione Toscana. ARPA Fonte Dati. Manuale Amministratore. L. Folchi (TAI) Redatto da

Programmazione I - Laboratorio

Corso di Laurea in Ingegneria Gestionale Esame di Informatica a.a giugno 2013

Esercitazione n 4. Obiettivi

Esercizi della lezione 5 di Java

Reflection in Java. Linguaggi Corso M-Z - Laurea in Ingegneria Informatica A.A

Progetto: ARPA Fonte Dati. ARPA Fonte Dati. Regione Toscana. Manuale Amministratore

Scope e visibilità per classi

Tipi di Dato Ricorsivi

UML Diagrammi delle classi. UML Diagramma classi 1

APPUNTI SUL LINGUAGGIO DI PROGRAMMAZIONE PASCAL

Prova d Esame Compito A

Abstract Data Type (ADT)

7 Esercitazione (svolta): Callback. Polling. Java RMI: callback. Server. Server. Client. Client. due possibilità:

Codifica: dal diagramma a blocchi al linguaggio C++

Introduzione al MATLAB c Parte 2

un file in formato FASTA contenente un elenco di sequenze una espressione regolare una indicazione se si tratta di DNA,RNA,proteine

PROGRAMMAZIONE AVANZATA JAVA E C. Massimiliano Redolfi. Lezione 7: Code, Stack, Liste PAJC. Ricerca. prof. Massimiliano Redolfi PAJC

Transcript:

obiettivi di questa seconda metà del corso fare un passo avanti rispetto a :... meccanismi di composizione dei dati puntatori ( strutture dinamiche collegate) strutture dinamiche collegate (liste, pile, code) V. Grassi - Fondamenti di Informatica (2a parte) L5-1 il tipo di dato lista motivazione : rappresentare sequenze dinamiche di elementi omogenei sequenza : insieme di elementi linearmente ordinato 1, 2, 3,..., n, dinamica : composizione variabile nel tempo inserzione/rimozione in qualsiasi posizione p.es. per mantenere ordinata la sequenza omogenea : elementi della sequenza dello stesso tipo come rappresentare una lista in C++? quale meccanismo? V. Grassi - Fondamenti di Informatica (2a parte) L5-2 1

meccanismo array? elementi omogenei sequenza naturalmente ordinata indici dellʼarray dinamismo? a) aggiungere un nuovo elemento? 0 1 N-1 operazioni costose non cʼè spazio rimedio: sovradimensionare lʼarray b) rimuovere un elemento?...... 0 1 N-1 si crea un buco rimedio: traslare parte dellʼarray V. Grassi - Fondamenti di Informatica (2a parte) L5-3 valore elemento succ elementi omogenei prec sequenza naturalmente ordinata relazioni di precedente/successore dinamismo? meccanismo puntatori? a) aggiungere un nuovo elemento? valore elemento valore elemento valore elemento valore elemento V. Grassi - Fondamenti di Informatica (2a parte) L5-4 2

b) rimuovere un elemento? valore elemento valore elemento valore elemento V. Grassi - Fondamenti di Informatica (2a parte) L5-5 definizione del tipo di dato lista (e del tipo di dato iteratore) T : insieme dei possibili valori P : insieme di iteratori un iteratore è un indicatore di un elemento in una lista operazioni del tipo di dato iteratore : get : P T get(p) restituisce il valore dellʼelemento indicato da p next : P P next(p) restituisce un iteratore che indica lʼelemento successivo a p previous : P P previous(p) restituisce un iteratore che indica lʼelemento precedente a p equal : P x P Bool equal(p1, p2) vale vero se p1 e p2 indicano lo stesso elemento, falso altrimenti is_null : P Bool Nota: is_null(p) non definita nel libro (cap. 16) is_null(p) vale vero se p non indica nessun elemento V. Grassi - Fondamenti di Informatica (2a parte) L5-6 3

p "Mario Rossi" "Anna Verdi" "Luca Neri" get(p) "Anna Verdi" p "Mario Rossi" "Anna Verdi" "Luca Neri" previous(p) p "Mario Rossi" "Anna Verdi" "Luca Neri" next(p) V. Grassi - Fondamenti di Informatica (2a parte) L5-7 operazioni del tipo di dato lista : push_back : lista(t) x T lista(t) push_back(l, t) inserisce t dopo lʼultimo elemento di l insert : lista(t) x P x T lista(t) insert(l, p, t) inserisce t prima dellʼ elemento di l indicato da p erase : lista(t) x P lista(t) erase(l, p) elimina da l lʼelemento indicato da p empty : lista(t) Bool Nota: empty(l) non definita nel libro (cap. 16) empty(l) vale "vero" se l è vuota, "falso" altrimenti begin : lista(t) P begin(l) restituisce un indicatore al primo elemento di l end : lista(t) P end(l) restituisce un indicatore allʼultimo elemento di l Nota: end(l) definita diversamente nel libro (cap. 16) V. Grassi - Fondamenti di Informatica (2a parte) L5-8 4

realizzazione in C++ del tipo di dato lista (e del tipo di dato iteratore) assumiamo T = insieme di stringhe ( liste di stringhe) realizzazione in C++ di un elemento della lista: valore elemento succ prec class Node {public: costruttore Node(string s); private: valore string data; Node* prec; Node* succ; friend class List; puntatori friend class Iterator; ; una classe qualificata come friend ha il diritto di accedere alla parte privata della classe che concede la qualifica - qui List e Iterator hanno il diritto di accedere alla parte privata di Node meccanismo da usare con cautela!!! V. Grassi - Fondamenti di Informatica (2a parte) L5-9 realizzazione in C++ del tipo di dato iteratore : class Iterator {public: costruttore Iterator(); string get() const; Iterator next() const; Iterator previous() const; funzioni membro bool equals(iterator b) const; bool is_null() const; private: Node* position; indicatore di un friend class List; elemento della lista ; Nota: nel libro (cap. 16) è definito anche un altro attributo privato Node* last; V. Grassi - Fondamenti di Informatica (2a parte) L5-10 5

realizzazione in C++ del tipo di dato lista : class List {public: List(); costruttore funzioni void push_back(string s); membro void insert(iterator p, string s); void erase(iterator p); bool empty() const; Iterator begin(); Iterator end(); private: Node* first; Node* last; ; List first last puntatori al primo e allʼultimo elemento della lista Nota: nel libro (cap. 16) erase() è di tipo Iterator Iterator position Node Node Node "Mario Rossi" "Anna Verdi" "Luca Neri" V. Grassi - Fondamenti di Informatica (2a parte) L5-11... List elenco; int num_nomi; Iterator pos; string nome, residuo; int c; esempio dʼuso del tipo di dato lista cout<<"scrivi numero nomi da inserire in elenco \n"; cin>>num_nomi; for (int i=1;i<=num_nomi;i++) {leggi nome inserisci nome in elenco, in ordine alfabetico; leggi nome; inserisci nome in 4a posizione; rimuovi il nome in 2a posizione; leggi nome; verifica se è presente in elenco; stampa tutti i nomi in elenco V. Grassi - Fondamenti di Informatica (2a parte) L5-12 6

inserzione in ordine alfabetico (1) void inserisci_in_ordine(list& l, string s) {Iterator i; se l è vuota inserisci s altrimenti { posiziona i all inizio della lista; avanza i finchè non trovi un elemento maggiore di s; se i indica un elemento maggiore di s inserisci s prima dell elemento indicato da i; altrimenti inserisci s dopo l elemento indicato da i; inserzione in ultima posizione void inserisci_in_ordine(list& l, string s) {Iterator i; if (l.empty()) l.push_back(s); else {i = l.begin(); while (!i.equals(l.end()) && i.get()<=s) i = i.next(); if (i.get()>s) l.insert(i,s); else l.push_back(s); V. Grassi - Fondamenti di Informatica (2a parte) L5-13 inserzione in ordine alfabetico (2) cout<<"scrivi numero nomi da inserire in elenco \n"; cin>>num_nomi; for (int i=1;i<=num_nomi;i++) {leggi nome; inserisci nome in elenco, in ordine alfabetico; cout<<"scrivi numero nomi da inserire in elenco \n"; cin>>num_nomi; risolve un problema getline(cin, residuo); di coabitazione tra for (int i=1; i<=num_nomi; i++) >> e getline() {getline(cin, nome); (vedi libro, sez. 6.1) inserisci_in_ordine(elenco, nome); V. Grassi - Fondamenti di Informatica (2a parte) L5-14 7

inserzione in 4a posizione leggi nome; inserisci nome in 4a posizione; leggi nome; posiziona l iteratore pos all inizio della lista; avanza pos fino alla 4a posizione inserisci il nuovo nome prima dell elemento indicato da pos cout<<"scrivi nome\n"; getline(cin, nome); pos = elenco.begin(); c = 1; while (c<4 &&!pos.equals(elenco.end())) {pos = pos.next(); c++; if (c==4) elenco.insert(pos, nome); else if??inserzione (c==3) impossibile?? elenco.push_back(nome); else cout<<"lista con meno di 3 elementi \n"; V. Grassi - Fondamenti di Informatica (2a parte) L5-15 rimozione dalla 2a posizione rimuovi il nome in 2a posizione; posizione l iteratore pos all inizio della lista; avanza pos fino alla 2a posizione rimuovi l elemento indicato da pos pos = elenco.begin(); c = 1; while (c<2 &&!pos.equals(elenco.end())) {pos = pos.next(); c++; if (c==2) elenco.erase(pos); else cout<<"lista con meno di 2 elementi \n"; V. Grassi - Fondamenti di Informatica (2a parte) L5-16 8

verifica presenza leggi nome; verifica se è presente in elenco; leggi nome; se la lista non è vuota posizione l iteratore pos all inizio della lista; scorri la lista, confrontando il nome con il valore dell elemento indicato da pos; cout<<"scrivi nome\n"; getline(cin, nome); pos = elenco.begin(); if (!elenco.empty()) {while (!pos.equals(elenco.end()) && pos.get()!=nome) pos = pos.next(); if (pos.get()==nome) cout<<nome<<" presente nella lista \n"; else cout<<nome<<" non presente nella lista \n"; else cout<<" lista vuota \n"; V. Grassi - Fondamenti di Informatica (2a parte) L5-17 stampa della lista stampa tutti i nomi in elenco se la lista non è vuota posizione l iteratore pos all inizio della lista; scorri la lista, e stampa il valore dell elemento indicato da pos; if (!elenco.empty()) {pos = elenco.begin(); while (!pos.is_null()) {cout << pos.get() << "\n"; pos = pos.next(); if (!elenco.empty()) {for (pos=elenco.begin();!pos.is_null();pos=pos.next()) cout << pos.get() << "\n"; versione alternativa V. Grassi - Fondamenti di Informatica (2a parte) L5-18 9

realizzazione in C++ del tipo di dato nodo class Node {public: costruttore Node(string s); private: valore string data; Node* prec; Node* succ; friend class List; friend class Iterator; ; costruttore : Node::Node(string s) {data = s; prec = ; succ = ; V. Grassi - Fondamenti di Informatica (2a parte) L5-19 realizzazione in C++ delle funzioni membro del tipo di dato iteratore class Iterator {public: costruttore Iterator(); string get() const; Iterator next() const; Iterator previous() const; bool equals(iterator b) const; bool is_null() const; private: Node* position; indicatore di un friend class List; elemento della lista ; costruttore : funzioni membro Iterator::Iterator() {position = ; V. Grassi - Fondamenti di Informatica (2a parte) L5-20 10

get : P T get(p) restituisce il valore dellʼelemento indicato da p string Iterator::get() const { assert(position!= ); return position->data; se position==,non è lecito accedere ai campi dellʼoggetto riferito (non esiste) equals : P x P Bool equals(p1, p2) vale vero se p1 e p2 indicano lo stesso elemento, falso altrimenti bool Iterator::equals(Iterator b) const { return position == b.position; V. Grassi - Fondamenti di Informatica (2a parte) L5-21 next : P P next(p) restituisce lʼ indicatore allʼelemento successivo a p (NON modifica p) "Mario Rossi" p "Anna Verdi" Iterator Iterator::next() const { assert(position!= ); Iterator t; t.position=position->succ; return t; se position==,non è lecito accedere ai campi dellʼoggetto riferito (non esiste) "Luca Neri" previous : P P previous(p) restituisce lʼ indicatore allʼelemento precedente a p (NON modifica p) Iterator Iterator::previous() const { assert(position!= ); Iterator t; t.position=position->prec; return t; p "Mario Rossi" "Anna Verdi" "Luca Neri" V. Grassi - Fondamenti di Informatica (2a parte) L5-22 11

is_null : P Bool is_null(p) vale vero se p non indica nessun elemento falso altrimenti bool Iterator::is_null() const {return position==; V. Grassi - Fondamenti di Informatica (2a parte) L5-23 realizzazione in C++ delle funzioni membro class List del tipo di dato lista {public: costruttore List(); funzioni void push_back(string s); membro void insert(iterator p, string s); void erase(iterator p); bool empty() const; Iterator begin(); Iterator end(); private: Node* first; Node* last; ; List first last puntatori al primo e allʼultimo elemento della lista Iterator position Node Node Node "Mario Rossi" "Anna Verdi" "Luca Neri" V. Grassi - Fondamenti di Informatica (2a parte) L5-24 12

costruttore : List::List() {first = ; last = ; first last List empty : lista(t) Bool empty(l) vale "vero" se l è vuota, "falso" altrimenti bool List::empty() const { return first==; V. Grassi - Fondamenti di Informatica (2a parte) L5-25 begin : lista(t) P begin(l) restituisce un indicatore al primo elemento di l Iterator List::begin() {Iterator i; i.position = first; return i; end : lista(t) P end(l) restituisce un indicatore allʼultimo elemento di l Iterator List::end() {Iterator i; i.position = last; return i; V. Grassi - Fondamenti di Informatica (2a parte) L5-26 13

push_back : lista(t) x T lista(t) push_back(l, t) inserisce t dopo lʼultimo elemento di l void List::push_back(string s) { crea un nuovo nodo (che contiene s) se (lista vuota) caso particolare altrimenti inseriscilo in ultima posizione V. Grassi - Fondamenti di Informatica (2a parte) L5-27 void List::push_back(string s) { Node* n = new Node(s); if (last == ) {first = n; last = n; else {n->prec = last; last->succ = n; last= n; first last List Node s List first last n: succ: prec: Node Node Node "..." "..." "..." succ: prec: V. Grassi - Fondamenti di Informatica (2a parte) L5-28 14

insert : lista(t) x P x T lista(t) insert(l, p, t) inserisce t prima dellʼ elemento di l indicato da p void List::insert(Iterator p, string s) {... - caso particolare: lista vuota if (empty()) push_back(s); else... first last List Node s V. Grassi - Fondamenti di Informatica (2a parte) L5-29 - altrimenti: 1) si crea il nodo da inserire, e si creano puntatori ai nodi che stanno prima e dopo il punto di inserzione ( facilita le operazioni) Node* n = new Node(s); Iterator p: Node* dopo = p.position; position Node* prima = dopo->prec; prima: dopo: 2) si aggancia il nuovo nodo alla lista n->prec = prima; n->succ = dopo; succ: prec: 3) si aggiornano i due nodi che precedono e seguono il nuovo nodo dopo->prec = n; if (prima==) first = n; else prima->succ = n; Node Node Node "..." "..." "..." Node s V. Grassi - Fondamenti di Informatica (2a parte) L5-30 n: succ: prec: se p indica il 1 elemento? occorre controllare se p indica lʼultimo elemento? 15

mettendo tutto insieme: insert : lista(t) x P x T lista(t) void List::insert(Iterator p, string s) {if (empty()) push_back(s); else {Node* n = new Node(s); Node* dopo = p.position; Node* prima = dopo->prec; n->prec = prima; n->succ = dopo; dopo->prec = n; if (prima==) first = n; else prima->succ = n; V. Grassi - Fondamenti di Informatica (2a parte) L5-31 erase : lista(t) x P lista(t) erase(l, p) elimina da l lʼelemento indicato da p void List::erase(Iterator p) {... - premessa: p deve indicare un elemento assert (p.position!= ); V. Grassi - Fondamenti di Informatica (2a parte) L5-32 16

- quindi : 1) si creano puntatori al nodo da rimuovere, e ai due nodi che stanno prima e dopo di lui ( facilita le operazioni) Node* da_rimuovere=p.position; Node* dopo=da_rimuovere->succ; Node* prima=da_rimuovere->prec; prima: succ: prec: Node Node Node "..." "..." "..." Iterator p: position da_rimuovere: 2) si disconnette il nodo da quello che lo precede oppure: if (da_rimuovere==first) if (prima==) first = dopo; se p indica il 1 elemento? else prima->succ = dopo; dopo: V. Grassi - Fondamenti di Informatica (2a parte) L5-33 - infine : 3) si disconnette il nodo da quello che lo segue (operando analogamente al punto 2) if (da_rimuovere==last) last = prima; else dopo->prec = prima; prima: Iterator p: position dopo: se p indica lʼultimo elemento? Node Node Node "..." "..." "..." succ: prec: da_rimuovere: 4) si cancella il nodo rimosso delete da_rimuovere; NOTA: p ora indica un elemento inesistente!!! V. Grassi - Fondamenti di Informatica (2a parte) L5-34 17

mettendo tutto insieme: erase : lista(t) x P lista(t) void List::erase(Iterator p) {assert (p.position!= ); Node* da_rimuovere = p.position; Node* dopo = da_rimuovere->succ; Node* prima = da_rimuovere->prec; if (prima==) first = dopo; else prima->succ = dopo; if (da_rimuovere==last) last = prima; else dopo->prec = prima; delete da_rimuovere; V. Grassi - Fondamenti di Informatica (2a parte) L5-35 18