Laboratorio di Algoritmi e Strutture Dati



Documenti analoghi
Algoritmi e Strutture Dati

Laboratorio di Algoritmi e Strutture Dati

Laboratorio di Algoritmi e Strutture Dati

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

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2

La struttura dati ad albero binario

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

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2

Utilizzo e scrittura di classi

dall argomento argomento della malloc()

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.

ESERCIZI DI PROGRAMMAZIONE C/C++ per le classi terza

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

Sottoprogrammi: astrazione procedurale

Visibilità dei Membri di una Classe

Algoritmi su array / 2

STRUTTURE NON LINEARI

Corso di Fondamenti di Informatica Algoritmi su array / 2

Il tipo di dato astratto Pila

Appello di Informatica B

Compito di Fondamenti di Informatica

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

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

20. Appunti sulle liste (gestione in linguaggio C#) 16/04/2015 Arraylist

Corso di Fondamenti di Informatica

LISTE, INSIEMI, ALBERI E RICORSIONE

Fondamenti di Informatica T-1, 2009/2010 Modulo 2 Prova d Esame 5 di Giovedì 15 Luglio 2010 tempo a disposizione 2h30'

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:

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

2. Spiegare brevemente qual è la funzione del compilatore e la sua importanza per il programmatore.

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

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

Informatica e Laboratorio di Programmazione C++ Object Oriented Programming Alberto Ferrari

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2

Informatica B. Sezione D. Scuola di Ingegneria Industriale Laurea in Ingegneria Energetica Laurea in Ingegneria Meccanica

Ricerca sequenziale di un elemento in un vettore

Alfabeto ed elementi lessicali del linguaggio C

Gestione dinamica di una pila

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

Strutture Dati e Liste 1 FONDAMENTI DI INFORMATICA FRANCO ZAMBONELLI STRUTTURE DATI E LISTE. Strutture Dati: Liste, Code, Pile

Inizializzazione, Assegnamento e Distruzione di Classi

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

Algoritmi di Ricerca. Esempi di programmi Java

Realizzazione di una classe con un associazione

Laboratorio di Informatica

Preparati per il compito in classe Modulo 5

costruttori e distruttori

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

Corso di INFORMATICA 2 (Matematica e Applicazioni)

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

Introduzione al Linguaggio C

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

INFORMATICA - I puntatori Roberta Gerboni

Classe Squadra. #include <iostream> using namespace std;

ESERCIZIO 1 (Definizione funzioni passaggio parametri per copia)

Informatica 3. LEZIONE 7: Fondamenti di programmazione orientata agli oggetti (1)

Grammatica di base: Pointers

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

Fondamenti di Informatica 2

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

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

Relazioni tra oggetti e classi : Composizione. Relazioni tra oggetti e classi : esempio di Aggregazione. classe contenitore

Verifica che una grammatica sia Context Free nel GrammaReader

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

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

Università degli studi di Roma Tor Vergata Ingegneria Medica Informatica I Programma del Corso

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica

Codifica: dal diagramma a blocchi al linguaggio C++

Programmazione Orientata agli Oggetti in Linguaggio Java

Esercizio: gestione di un conto corrente

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

La programmazione ad oggetti (OOP)

Ricorsione. (da lucidi di Marco Benedetti)

Fondamenti di Informatica T-1, 2010/2011 Modulo 2. Prova d Esame 4A di Martedì 21 Giugno 2011 tempo a disposizione 2h

Il paradigma OO e le Classi

Archivio CD. Fondamenti di Programmazione

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

Prova d Esame Compito A

Laboratorio di programmazione

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

I tipi di dato astratti

Matematica - SMID : Programmazione Febbraio 2009 FOGLIO RISPOSTE

Algoritmi e Strutture Dati & Laboratorio di Algoritmi e Programmazione

Transcript:

Realizzazione di Liste Laboratorio di Algoritmi e Strutture Dati Domenico Redavid redavid@di.uniba.it Materiale di base gentilmente concesso dal dott. Nicola Di Mauro Ricercatore presso l'univ. di Bari

Lista in C++ senza astrazione realizzazione con puntatori #include <cstdlib> #include <iostream> using namespace std; /* Definizione tipo nodo */ typedef int elemento; typedef struct elem_lista{ elemento valore; elem_lista* succ; nodo; typedef nodo* Lista; /* Definizione tipo lista di elemento */ int main(){ /* creazione della lista */ Lista testa = new nodo; // testa è un puntatore al primo nodo testa->valore = 1; testa->succ = NULL; /* inserimento primo elemento */ /* inserimento secondo elemento */ Lista iter = testa; iter->succ = new nodo; iter->succ->valore = 2; iter->succ->succ = NULL; /* inserimento terzo elemento */ iter = iter->succ; iter->succ = new nodo; iter->succ->valore = 3; iter->succ->succ = NULL; /* visualizzazione elementi */ iter = testa; cout << "stampa lista: "; while (iter!= NULL){ cout << iter->valore << " "; iter = iter->succ; /* eliminazione secondo elemento */ iter = testa->succ; testa->succ = iter->succ; delete iter; iter = testa; cout << "stampa lista: "; while (iter!= NULL){ cout << iter->valore << " "; iter = iter->succ; listapuntatori.cpp

Lista in C++ senza astrazione realizzazione con vettori #include <cstdlib> #include <iostream> using namespace std; /* Definizione tipo nodo */ typedef int elemento; typedef struct elem_lista{ elemento valore; elem_lista* succ; nodo; typedef nodo* Lista; /* Definizione tipo lista di elemento */ #include <cstdlib> #include <iostream> using namespace std; /* Definizione tipo lista di interi */ const int DIMMAX = 50; typedef struct _lista { int elementi [DIMMAX]; int nelem; Lista; int main(){ /* creazione della lista */ Lista testa = new nodo; // testa è un puntatore al primo nodo testa->valore = 1; testa->succ = NULL; /* inserimento primo elemento */ /* inserimento secondo elemento */ Lista iter = testa; iter->succ = new nodo; iter->succ->valore = 2; iter->succ->succ = NULL; /* inserimento terzo elemento */ iter = iter->succ; iter->succ = new nodo; iter->succ->valore = 3; iter->succ->succ = NULL; /* visualizzazione elementi */ iter = testa; cout << "stampa lista: "; while (iter!= NULL){ cout << iter->valore << " "; iter = iter->succ; /* eliminazione secondo elemento */ iter = testa->succ; testa->succ = iter->succ; delete iter; iter = testa; cout << "stampa lista: "; while (iter!= NULL){ cout << iter->valore << " "; iter = iter->succ; listapuntatori.cpp int main() { int i; Lista L; /* creazione della lista */ L.nelem = 0; /* inserimento primo elemento */ L.elementi[L.nelem] = 1; L.nelem++; /* inserimento secondo elemento */ L.elementi[L.nelem] = 2; L.nelem++; /* inserimento terzo elemento */ L.elementi[L.nelem] = 3; L.nelem++; /* visualizzazione elementi */ i = 0; cout << "stampa lista: "; while (i < L.nelem){ cout << L.elementi[i] << " "; i++; /* eleminazione secondo elemento */ L.elementi[1] = L.elementi[2]; L.nelem--; i = 0; cout << "stampa lista: "; while (i < L.nelem){ cout << L.elementi[i] << " "; i++; listavett.cpp

Output dei due programmi

Applicare l'astrazione Realizzazione lista mediante puntatori Applicare l'astrazione richiede: Verifica della specifica sintattica Verifica della specifica semantica

Lista in C++ con astrazione realizzazione mediante puntatori #ifndef _LISTAP_H #define _LISTAP_H typedef int tipoelem; typedef struct _cella { tipoelem elemento; struct _cella* succ; struct _cella* prec; cella; typedef cella* posizione; typedef cella* Lista; void crealista(lista); bool listavuota(lista); tipoelem leggilista(posizione); // warning! non rispetta la specifica sintattica void scrivilista(tipoelem, posizione); // warning! non rispetta la specifica sintattica posizione primolista(lista); bool finelista(posizione, Lista); posizione succlista(posizione); // warning! non rispetta la specifica sintattica posizione predlista(posizione); // warning! non rispetta la specifica sintattica void inslista(tipoelem,posizione); // warning! non rispetta la specifica sintattica void canclista(posizione); // warning! non rispetta la specifica sintattica #endif // _LISTAP_H listap.h

#include "listap.h" Lista in C++ con astrazione violazioni / 1 void crealista(lista L) { tipoelem ElementoNullo; L = new cella; L->succ = L; L->prec = L; //la sentinella punta a se stessa bool listavuota(lista L) { return ((L->succ == L) && (L->prec == L)); tipoelem leggilista(posizione p) {return p->elemento; void scrivilista(tipoelem a, posizione p) {p->elemento = a posizione primolista(lista L) {return L->succ; bool finelista(posizione p, Lista L) {return (p==l); posizione succlista(posizione p) {return p->succ; posizione predlista(posizione p) {return p->prec; void inslista(tipoelem a, posizione p) { posizione temp = new cella; temp->elemento = a; temp->prec = p->prec; temp->succ = p; p->prec->succ = temp; p->prec = temp; p=temp; SPECIFICA SINTATTICA NON RISPETTATA void canclista(posizione p) { posizione temp; temp=p; p->succ->prec = p->prec; p->prec->succ = p->succ; p=p->succ; delete temp; listap.cpp

Lista in C++ con astrazione violazioni / 2 #include "listap.h" #include "listap.h" int main() { Lista l; crealista(l); posizione indiceelemento = primolista(l); tipoelem a; a = 14; inslista(a,indiceelemento); a = 4; indiceelemento = succlista(indiceelemento); inslista(a,indiceelemento); a = 2007; indiceelemento = succlista(indiceelemento); inslista(a,indiceelemento); main1.cpp int main() { Lista l; posizione p; crealista(l); crealista(p); // violazione: crealista invocato passando una posizione posizione indiceelemento = primolista(l); tipoelem a; a = 14; inslista(a,indiceelemento); l->elemento=2; // violazione: accesso diretto main2.cpp Opero senza sapere a quale lista le operazioni si riferiscono

Obiettivi Realizzazione di LISTA di interi mediante vettori Realizzazione di LISTA di elementi di tipo più complesso (libro) mediante vettori Realizzazione di LISTA di elementi di tipo non specificato mediante vettori e uso di template Realizzazione di LISTA circolare mediante puntatori Applicazione alla risoluzione di esercizi

Realizzazione sequenziale con vettore #ifndef _LISTAV_H #define _LISTAV_H // lunghezza massima della lista const int DIMENSIONE = 1024; // classe Lista class Lista{ public: typedef int tipoelem; typedef int posizione; Lista(); // costruttore ~Lista(); // distruttore // operatori void crealista(); bool listavuota() const; tipoelem leggilista(posizione) const; void scrivilista(tipoelem, posizione); posizione primolista() const; bool finelista(posizione) const; posizione succlista(posizione) const; posizione predlista(posizione) const; void inslista(tipoelem, posizione); void canclista(posizione); private: tipoelem elementi[dimensione]; int lunghezza; ; #endif // _LISTAV_H Interfaccia: - direttive al preprocessore - dimensione massima della lista - classe Lista - parte pubblica - tipoelem - posizione - costruttore e distruttore - operatori - parte privata - vettore elementi - lunghezza Come generalizzare un elemento (cella) di una lista? listav.h (v0)

La classe Cella Tipo elemento intero #ifndef _CELLALV_H #define _CELLALV_H typedef int tipoelem; // classe CellaLista class CellaLista{ public: CellaLista(); //costruttore CellaLista(tipoelem); ~CellaLista(){; //distruttore void scrivicella(tipoelem); tipoelem leggicella() const; bool operator == (CellaLista); private: tipoelem etichetta; ; Definizione della classe CellaLista Interfaccia - classe CellaLista -parte pubblica - tipoelem - costruttori e distruttore - scrivicella e leggicella - sovraccarico dell'operatore == - parte privata - etichetta #endif // _CELLALV_H cellalv.h (v0) Come generalizzare il dato tipoelem?

La classe Libro #ifndef _LIBRO_H #define _LIBRO_H #include <string> #include <iostream> using namespace std; class Libro{ public: Libro(); Libro(string); void settitolo(string); string gettitolo() const; bool operator ==(Libro); private: string titolo; ; #endif // _LIBRO_H libro.h - classe libro - costruttori - metodi per scrittura e lettura - sovraccarico dell'operatore == - titolo #include "libro.h" Libro::Libro(){ titolo = ""; Libro::Libro(string t){ settitolo(t); void Libro::setTitolo(string t){ titolo = t; string Libro::getTitolo() const{ return (titolo); // sovraccarico dell'operatore == bool Libro::operator==(Libro l){ return (gettitolo() == l.gettitolo()); libro.cpp

La classe Cella Tipo elemento Libro #ifndef _CELLALV_H #define _CELLALV_H #include libro.h typedef Libro tipoelem; // classe CellaLista class CellaLista{ public: CellaLista(); //costruttore CellaLista(tipoelem); ~CellaLista(){; //distruttore void scrivicella(tipoelem); tipoelem leggicella() const; bool operator == (CellaLista); private: tipoelem etichetta; ; #endif // _CELLALV_H cellalv.h Implementazione della classe CellaLista #include "cellalv.h" CellaLista::CellaLista() { CellaLista::CellaLista(tipoelem label){ etichetta = label; void CellaLista::scriviCella(tipoelem label){ etichetta = label; tipoelem CellaLista::leggiCella() const{ return (etichetta); bool CellaLista::operator==(CellaLista cella){ return(leggicella() == cella.leggicella()); cellalv.cpp

La classe Lista CellaLista contiene un elemento di tipo tipoelem #ifndef _LISTAV_H #define _LISTAV_H #include "cellalv.h" // lunghezza massima della lista const int DIMENSIONE = 1024; // classe Lista class Lista{ public: typedef int posizione; \\ typedef int tipoelem; Lista(); // costruttore ~Lista(); // distruttore // operatori void crealista(); bool listavuota() const; tipoelem leggilista(posizione) const; void scrivilista(tipoelem, posizione); posizione primolista() const; bool finelista(posizione) const; posizione succlista(posizione) const; posizione predlista(posizione) const; void inslista(tipoelem, posizione); void canclista(posizione); private: CellaLista elementi[dimensione]; int lunghezza; bool checkpos(posizione) const; ; #endif // _LISTAV_H

Implementazione della classe Lista Prima parte #include lista.h Lista::Lista(){ crealista(); Lista::~Lista() {; void Lista::creaLista(){ lunghezza = 0; bool Lista::listaVuota() const { return(lunghezza == 0); Lista::posizione Lista::primoLista() const{ return(1); // e quindi pos(1)=pos(n+1) se la lista è vuota (n=0) bool Lista::checkPos(posizione p) const{ return ( (0 < p) && (p < lunghezza+1)) Evita di restituire la posizione di una cella inesistente Lista::posizione Lista::succLista(posizione p) const{ if ( checkpos(p)) // precondizione return(p+1); else return(p); Lista::posizione Lista::predLista(posizione p) const{ if ( checkpos(p)) // precondizione return(p-1); else return(p); listav.cpp

Implementazione della classe Lista Seconda parte bool Lista::fineLista(posizione p) const{ if ( checkpos(p)) // precondizione return( (p == 0) (p == lunghezza+1)); else return(false); posizione=0 o > della lunghezza punta alla prima cella tipoelem Lista::leggiLista(posizione p) const{ if ( checkpos(p)) // precondizione return(elementi[p-1].leggicella()); void Lista::scriviLista(tipoelem a, posizione p){ if ( checkpos(p)) // precondizione elementi[p-1].scrivicella(a); void Lista::insLista(tipoelem a, posizione p){ if ( checkpos(p)) { // precondizione for (int i=lunghezza; i>=p; i--) elementi[i] = elementi[i-1]; // indice elementi tra 0 e lunghezza-1 elementi[p-1].scrivicella(a); lunghezza++; void Lista::cancLista(posizione p){ if ( checkpos(p)) // precondizione if (!listavuota()){ for (int i=p-1;i<(lunghezza-1);i++) elementi[i]=elementi[i+1]; lunghezza--; listav.cpp p=0 cella vuota, p=1 cella in posizione 0 del vettore parto dalla fine della lista e la scalo A destra di una posizione fino a p parto da p-1 e la scalo a sinistra di una posizione

Funzioni di servizio #ifndef _SERVIZIOLV_H #define _SERVIZIOLV_H #include <lista.h> void stampalista(lista &); void epurazionelista(lista &);... Funzioni di servizio utente per le liste - stampalista: visualizzazione elem. - epurazionelista: eliminazione duplicati -... #endif // _SERVIZIOLV_H serviziolistav.h #include <iostream> #include <lista.h> using namespace std; void stampalista(lista &l){ cout<<"["; Lista::posizione indice; for (indice = l.primolista(); ((!l.finelista(indice)) && (indice < DIMENSIONE)); indice = l.succlista(indice)){ cout << l.leggilista(indice).gettitolo(); if (!l.finelista(l.succlista(indice))) cout << ", "; cout<<"]\n";... serviziolistav.cpp

Epurazione Funzione di servizio epurazione (serviziolista.cpp) void epurazionelista(lista &l){ Lista::posizione p,q,r; p = l.primolista(); while (!l.finelista(p)){ q = l.succlista(p); while (!l.finelista(q)){ if (l.leggilista(p) == l.leggilista(q)){ r = l.succlista(q); l.canclista(q); q = r; else q = l.succlista(q); p=l.succlista(p);

Test di Lista #include <stdio.h> #include <iostream> #include <listav.h> #include <serviziolista.h> using namespace std; int main(){ Lista l; Lista::posizione indiceelemento = l.primolista(); Libro libro; libro.settitolo("primo"); l.inslista(libro,indiceelemento=l.succlista(indiceelemento)); libro.settitolo("secondo"); l.inslista(libro,indiceelemento=l.succlista(indiceelemento)); libro.settitolo("secondo"); l.inslista(libro,indiceelemento=l.succlista(indiceelemento)); libro.settitolo("quarto"); l.inslista(libro,indiceelemento=l.succlista(indiceelemento)); cout <<"\nl\'attuale lista e\': "; stampalista(l); cout <<"\nora inserisco l\'elemento Dieci nella seconda posizione...\n"; libro.settitolo("dieci"); l.inslista(libro,l.succlista(l.primolista())); cout << "\nlista inserita: " << endl; stampalista(l); cout << "\nepurazione lista: " << endl; epurazionelista(l); stampalista(l); return 0; testlista.cpp

Realizzazioni Proposte Libro: libro.h, libro.cpp CellaLista: cellalv.h, cellalv.cpp; (la cella contiene elementi di tipo libro); Lista: realizzazione lista (listav.h, listav.cpp) e funzioni di servizio (serviziolista.h, serviziolista.cpp); TestLista: testlistav.cpp (main per prova lista di libro)

Obiettivi Realizzazione di LISTA di interi mediante vettori OK Realizzazione di LISTA di elementi di tipo più complesso (libro) mediante vettori OK Realizzazione di LISTA di elementi di tipo non specificato mediante vettori e uso di template Realizzazione di LISTA circolare mediante puntatori Applicazione alla risoluzione di esercizi