1 MODULO STRUTTURE DATI FONDAMENTALI: Strutture dinamiche classe 4° INDUSTRIALE INFORMATICA Focus on.

Slides:



Advertisements
Presentazioni simili
Tipi di dato astratti Lista, Pila, Coda, Albero.
Advertisements

Estendere i linguaggi: i tipi di dato astratti
Strutture dati lineari
Procedure e funzioni ricorsive
PHP.
1 Informatica Generale Susanna Pelagatti Ricevimento: Mercoledì ore presso Dipartimento di Informatica, Via Buonarroti,
LIP: 1 Marzo 2005 Classe Object e Vettori. Partiamo da Lesercizio dellultima esercitazione realizzato tramite array Vedremo come si puo fare in modo piu.
Fondamenti di Informatica I CDL in Ingegneria Elettronica - A.A CDL in Ingegneria Elettronica - A.A Strutture dati dinamiche.
Fondamenti di Informatica I CDL in Ingegneria Elettronica - A.A CDL in Ingegneria Elettronica - A.A Strutture dati dinamiche.
Fondamenti di Informatica
UD 3: “Le Liste” UD 4: “Pile e Code” UD 5: “Alberi e grafi”
Strutture dati elementari
Fondamenti di Informatica II Ingegneria Informatica / Automatica (A-I) Meccanica Prof. M.T. PAZIENZA a.a – 3° ciclo.
Fondamenti di Informatica II Ingegneria Informatica / Automatica (A-I) Meccanica Prof. M.T. PAZIENZA a.a – 3° ciclo.
Fondamenti di Informatica 2 Ingegneria Informatica Docente: Giovanni Macchia a.a
1 FONDAMENTI DI INFORMATICA II Ingegneria Gestionale a.a ° Ciclo Liste.
STRUTTURE DATI e LABORATORIO II ESERCITAZIONE N°13 Heap massimo.
Tail recursion: esempio
Alberi binari Definizione della struttura dati: struct tree { };
Allocazione dinamica della memoria
1 Corso di Informatica (Programmazione) Esercitazione 2 (3 dicembre 2008)
CORSO DI PROGRAMMAZIONE II
Heap allocation e garbage collector di Oberon Algoritmo Quick Fit e garbage collector mark and sweep.
Esercizi su code Date due code in ingresso a valori interi in ordine crescente, scrivere una funzione che restituisca una terza coda che contenga i valori.
memoria gestita staticamente:
1 Strutture Dinamiche Corso di Informatica A Vito Perrone.
Esercizi di riepilogo sul linguaggio C: file, puntatori, liste
Esercizi Puntatori, struct con campi puntatore, puntatori a struct, rapporto tra array e puntatori. FUNZIONI Passaggio di parametri per indirizzo, passaggio.
Fondamenti di Informatica1 Realizzazione software Due fasi: 1. Specifica dell'algoritmo 1.a Definizione dei dati 1.b Definizione della modalità della loro.
Fondamenti di Informatica
Le funzioni.
Lezione VII Laboratorio di Programmazione. Simulazione esame Scrivere in C++ una funzione di nome RICERCA che, presi come parametri. un array A di numeri.
1.Scrivere una funzione per cercare un numero x in una lista circolare di interi. La funzione deve restituire NULL se il numero non esiste. 2.Scrivere.
1 ListaDiElem Cancella( ListaDiElem lista, TipoElemento elem ) { ListaDiElem puntTemp; if( ! ListaVuota(lista) ) if( lista–>info == elem ) { puntTemp =
15 maggio 2002 Avvisi: Ultima lezione: mercoledì 29 maggio II Esonero: mercoledì 5 giugno, ora da stabilire.
Corso di informatica Athena – Periti Informatici
C. Gaibisso Programmazione di Calcolatori Lezione XXII La struttura di dati lista di variabili strutturate Programmazione di Calcolatori: le liste di.
Esercizi Liste.
ISTITUTO STATALE DI ISTRUZIONE SUPERIORE F. ENRIQUES CORSO JAVA – PROVA FINALE DEL 21 MAGGIO 2007 NOME: COGNOME: ________________________________________________________________________________.
Grafi Rappresentazione mediante liste di adiacenza:
Tail recursion: esempio
Alberi binari Definizione della struttura dati: struct tree { };
Fondamenti di Informatica II Ingegneria Informatica / Automatica (A-I) Meccanica Prof. M.T. PAZIENZA a.a – 3° ciclo.
Nota (rif. alla lezione precedente): Vector vs ArrayList Le classi generiche Vector e ArrayList sono sostanzialmente equivalenti, ma: I metodi.
Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 5 Le strutture informative Corso di Informatica 2 a.a. 2003/04 Lezione 5.
Introduzione a Javascript
Esercitazione su Vector. Permette di definire collezioni di dati generiche, che sono in grado di memorizzare elementi di ogni sottotipo di Object Definito.
AlgoLab - Pile e Code Pile e code Laboratorio di Algoritmi 02/03 Prof. Ugo de’ Liguoro.
Strutture di controllo Esercizi!. Utilizzare i metodi: I modi per poter richiamare un metodo, di una classe (ad esempio SavitchIn) sono due. 1) E’ sempre.
Fondamenti di Informatica II Ingegneria Informatica (A-I) Prof. M.T. PAZIENZA a.a – 3° ciclo.
Algoritmi e Strutture Dati Strutture Dati Elementari.
MODULO STRUTTURE DATI FONDAMENTALI: Strutture dinamiche
1. 2 Ricordiamo che: La pila o stack è una struttura astratta composta da più elementi omogenei. Una pila è uno stack di dati con accessi del tipo LIFO.
Relazione sulle strutture dati Svolta da: Buccella Simone Strutture di dati Aree di memoria Puntatore numericibooleani alfabetici Statici dinamici Puntatori.
1 Il linguaggio C Precisazioni sull’esperienza in laboratorio.
ALLOCAZIONE STATICA: LIMITI Per quanto sappiamo finora, in C le variabili sono sempre dichiarate staticamente –la loro esistenza deve essere prevista e.
Liste Concatenate 11 Aprile E’ una delle strutture dati fondamentali in tutti i linguaggi di programmazione di alto livello Una Lista Concatenata.
1 Strutture dati. 2 Astrazione Non vogliamo sapere l’organizzazione fisica dei dati  indirizzi e celle di memoria Ci interessa solo la loro organizzazione.
LIP: 2 Maggio 2008 Classi Astratte. Cos’e’ una Classe Astratta una classe astratta e’ un particolare tipo di classe permette di fornire una implementazione.
Sommario Oggetti immutabili e non Tipi Primitivi: String, Arrays.
Ordinamento dei vettori (SELECTION-SORT) Ordinamento per selezione (selection- sort) Si cerca l’elemento più piccolo e si scambia con l’elemento in posizione.
Esercizi.
LIP: 4 Maggio 2007 Interfacce. Cos’e’ una Interfaccia una interfaccia e’ un particolare tipo di classe contiene solo la specifica non ha implementazione.
Corso di Laurea Ingegneria Informatica Fondamenti di Informatica
Corso di Laurea Ingegneria Informatica Fondamenti di Informatica
Corso di Algoritmi e Strutture Dati con Laboratorio Java Collections Framework (II parte)
1 MODULO STRUTTURE DATI FONDAMENTALI: Strutture dinamiche classe 4° INDUSTRIALE ABACUS Ud1Strutture dati lineariTempi -Liste semplicemente puntate 3h+3h.
Lezione n. Parole chiave: Corso di Laurea: Insegnamento: Docente: A.A Salvatore Cuomo Strutture dati di tipo astratto 19 Strutture dati,
10. Programmazione Ricorsiva Ing. Simona Colucci Informatica - CDL in Ingegneria Industriale- A.A
13. Strutture dati dinamiche Ing. Simona Colucci Informatica - CDL in Ingegneria Industriale- A.A
Transcript della presentazione:

1 MODULO STRUTTURE DATI FONDAMENTALI: Strutture dinamiche classe 4° INDUSTRIALE INFORMATICA Focus on

2 Implementazione di strutture lineari E’ possibile implementare una struttura dati lineare in modo:  statico (tramite Array)  dinamico (tramite una successione di record collegati tra loro per mezzo di puntatori)

3 Limiti dell’allocazione statica della memoria gli array  OCCUPAZIONE DI MEMORIA: sovradimensionamento della struttura dovuto alla difficoltà di stima a priori  VELOCITÀ IN ESECUZIONE: rigidità nelle operazioni di inserimento e cancellazione

4 Ud1. STRUTTURE DATI DINAMICHE Le Liste semplici Una lista consente di memorizzare dati in modo dinamico, cioè all’occorrenza nel programma Richiamo: un puntatore rappresenta l’indirizzo di memoria della variabile puntata. Si possono definire puntatori a variabile di tipo intero, reale ma anche a variabili strutturate come ad esempio a record. Def: una lista semplice è una successione di record costituiti da due o più campi di cui uno sicuramente di tipo puntatore e gli altri di tipo informativo. L’elemento generico è il record “vagone” cha ha almeno due campi “scomparti” ed uno di essi è il puntatore “gancio” che consente il collegamento agli altri vagoni

5 Creazione di una lista L’operazione di creazione lista prevede: 1. la definizione della struttura, 2.la dichiarazione di un puntatore globale “motrice” che regge tutti gli altri vagoni 3.la creazione di un nuovo elemento che si deve attaccare alla motrice

6 …… struct vagone {int info; struct vagone * prox}; struct vagone * motrice=NULL; /*Inizial.*/ … void CreaLista (int x) {struct vagone * nuovo=NULL; /*Inizial.*/ nuovo=new(struct vagone); /*allocazione nuovo vagone */ nuovo->info=x; /* accesso ed assegnazione al campo info */ nuovo->prox=NULL; motrice=nuovo; } Creazione di una lista in C++ MOTRICE NUOVO X INFOPROX VAGONE

7 Inserimento in testa Nell’inserimento in testa si deve collegare un nuovo record in prima posizione ossia deve essere puntato dalle motrice. Il collegamento che va realizzato per primo è quello del nuovo record con il resto della lista. Successivamente si può staccare la motrice e farla puntare al nuovo record

8 Inserimento in testa in C++ … void InsTesta (int x) { struct vagone * nuovo=NULL; /*Inizial.*/ nuovo= new(struct vagone); nuovo->info=x; nuovo->prox=motrice; motrice=nuovo; } NUOVO MOTRICE XABC

9 Inserimento in coda In questa funzione scorro tutta la lista fino a quando non trovo l’ultimo vagone a questo attacco il nuovo

10 Inserimento in coda in C++ MOTRICE APP NUOVO X ABC … void InsCoda (int x) {struct vagone * nuovo=NULL; struct vagone * app=NULL; nuovo= new(struct vagone); nuovo->info=x; nuovo->prox=NULL; if (motrice==NULL)/* la lista è vuota */ InsTesta(x); /* chiamata alla funzione */ else { app=motrice; while (app->prox !=NULL) app=app->prox; app->prox=nuovo; }

11 Inserimento in un punto qualunque con condizione Per inserire un nuovo vagone in una posizione qualunque con il rispetto di una condizione abbiamo bisogno di un puntatore che: 1.scorra la lista 2.trovi la posizione 3.realizzi i collegamenti

12 Inserimento in un punto qualunque con condizione in C++ … void InsQlq (int x) {struct vagone * nuovo=NULL; struct vagone * app=NULL; nuovo= new(struct vagone); nuovo->info=x; nuovo->prox=NULL; if (motrice->info==(condizione)) { nuovo->prox=motrice; /*inserimento in testa*/ motrice=nuovo;} else { app=motrice; while((app->prox!=NULL)&&((app->prox->info) !=(condizione)) app=app->prox; if (app-> prox==NULL) cout<<“\n Elemento non inseribile condizione non verificata”; else{ nuovo->prox=app->prox; app->prox=nuovo; } } } MOTRICE APP NUOVO X CBA

13 Cancellazione in testa La cancellazione di un record “vagone” in testa si effettua facendo scorrere in avanti di una struttura (vagone) il puntatore che punta tutto il treno (motrice).

14 Cancellazione in testa In C++ … Void DropTesta () { motrice=motrice->prox; } MOTRICE ABCD

15 Cancellazione in coda Cancellare l’ultimo vagone della coda presuppone lo scorrimento di un puntatore d’appoggio che determina il vagone terminale della lista per interrompere tale collegamento

16 Cancellazione in coda in C++ … Void DropCoda () { struct vagone * app=NULL; if (motrice->prox==NULL) motrice=NULL; else{ app=motrice; while(app->prox->prox !=NULL) app=app->prox; app->prox=NULL; } } MOTRICE APP ABC MOTRICE X

17 Cancellazione in un punto qualunque con condizione Per cancellare un vagone in un punto qualunque abbiamo bisogno di un puntatore che: 1.scorra la lista 2.trovi il vagone da cancellare 3.realizzi i vari collegamenti

18 Cancellazione in un punto qualunque con condizione in C++ … Void DropQlq () {struct vagone * app=NULL; if ((motrice->prox==NULL) && (motrice->info==(Condizione)) DropTesta(); /* chiamata alla funzione */ else{ app=motrice; while((app->prox !=NULL) && (app->prox->info!= Condizione)) app=app->prox; if (app->prox==NULL) cout<<“\n condizione non verificata da alcun elemento”; else app->prox=app->prox->prox; } } MOTRICE ABCD APP

19 Confronto tra struttura statica di array e struttura dinamica di lista Si può osservare che: -entrambe sono costituite da elementi omogenei tra loro  le componenti dell’array sono solitamente di un tipo standard definito dall’utente,  gli elementi della lista sono sempre formati da una o più parti informative e da una di tipo puntatore -la lista consente dimensioni variabili, mentre l’array richiede una dimensione prefissata -L’accesso all’array avviene mediante l’indice della componente, l’accesso agli elementi della lista comporta lo scorrimento degli elementi con un puntatore inizialmente posizionato sulla testa che viene successivamente spostato tramite i puntatori

20 Vantaggi e svantaggi dell’impiego della lista rispetto all’array Con la lista vi è una maggiore occupazione di memoria dovuta alla presenza di puntatori e lo svantaggio di una minore semplicità di uso Il vantaggio dell’uso di una lista sta nel poter effettuare su di essa in modo più rapido le operazioni di inserimento ed eliminazione dei dati

21 Verifica delle conoscenze acquisite: Test vero/falso Un nodo in una lista è un’ unità atomica di informazione Il valore NULL assegna ad un puntatore il valore zero Un puntatore contiene l’indirizzo di memoria della variabile puntata L’aggettivo lineare, riferito ad una lista semplice significa che tutti i nodi della lista hanno un predecessore ed un successore La lista e una struttura dati statica Le variabili dinamiche vengono dichiarate in testa al programma L’elemento generico di una lista semplice è costituito da un record che ha almeno due campi di cui uno puntatore Se voglio inserire un nuovo elemento in una lista sicuramente dovrò creare una nuova struttura dove inserirlo e poi ricercare la posizione dove collocarlo VF

22 1)Scrivere la funzione di visualizzazione che legge gli elementi di una lista, a partire dal primo, seguendo l’ordine dei puntatori. 2) Fornire la dichiarazione di una lista con puntatori per memorizzare un elenco ordinato di nomi e città. 3) Utilizzando la struttura dinamica costruita nell’esercizio precedente, costruire una funzione che dopo aver acquisito da tastiera un nome, lo ricerchi nella lista: se lo trova visualizza la città corrispondente, altrimenti scrive un messaggio di non trovato. Esercizi di applicazione proposti per casa mirati all’acquisizione delle competenze... da realizzare successivamente in laboratorio

23 Esercizio di applicazione proposto per casa mirato all’acquisizione delle capacità Costruire una rubrica telefonica che contenga, per ciascuna persona, il nome, il cognome, e il numero di telefono. Tale rubrica dovrà essere gestita con una lista. Si deve prevedere un menù di scelta che consenta all’utente di scegliere tra le seguenti funzioni in modo ripetuto: -Una funzione di inserimento di una nuova persona in ordine alfabetico rispetto al cognome; -Una funzione di ricerca per cognome che stampi il numero di telefono; -Una funzione di cancellazione dalla rubrica.... da realizzare successivamente in laboratorio

24 STRUTTURE DATI FONDAMENTALI: Le Code Una coda è una struttura logica che segue una politica di tipo FIFO (First in First out). Per gestire una coda sono necessarie almeno tre funzioni:  push  pop  codavuota. La coda a livello d’implementazione è una lista in cui l’inserimento si effettua sulla fine e l’estrazione sull’inizio.

25 STRUTTURE DATI FONDAMENTALI: Le Code in C++ … /* definizione dell’elemento della coda */ struct elecoda{ int info; struct elecoda * prox; } ; … struct coda{ struct elecoda * inizio; struct elecoda * fine; }; struct coda queue; /* variabile globale */ queue.inizio= NULL; /*inizializzazione*/ queue.fine= NULL;... INIZIO FINE queue info elecoda prox

26 Inserimento La funzione d’inserimento in coda PUSHCODA crea un nuovo record nel quale inserisce la nuova informazione e lo attacca alla fine della coda. Si utilizza anche una funzione booleana CODAVUOTA che ci dice se la coda ha o meno elementi

27 Inserimento in C++ void pushcoda (int x) {struct elecoda * nuovo=NULL; nuovo = new( struct elecoda); /*allocazione*/ nuovo->info=x; nuovo->prox=NULL; if (codavuota() ) { queue.inizio=nuovo; queue.fine= nuovo;} else { queue.fine-> prox = nuovo; queue.fine=queue.fine-> prox; } } NUOVO X ABC INIZIO FINE queue INIZIO FINE queue x NUOVO … bool codavuota () { if (queue.inizio==queue.fine==NULL) return true; return false;}...

28 Cancellazione La cancellazione elimina il primo elemento della lista gestita come coda buttando fuori il valore.

29 Cancellazione in C++... int popcoda() { int emergente; emergente=queue.inizio->info; queue.inizio=queue.inizio->prox; return emergente; } ABC INIZIO FINE queue EMERGENTE A

30 STRUTTURE DATI FONDAMENTALI: Le Pile Per gestire una pila sono necessarie almeno tre funzioni:  push  pop  pilavuota La pila a livello d’implementazione è una lista in cui sia l’inserimento che l’estrazione si effettuano sulla fine e l’estrazione sulla testa Una pila e una struttura logica che segue una politica di tipo LIFO ( Last in First out).

31 STRUTTURE DATI FONDAMENTALI: Le Pile in C++ … /* definizione dell’elemento della pila */ struct elepila{ int info; struct elepila * prox; } ; struct elepila * testa =NULL; /* inizializzazione*/ TESTA info elepila prox

32 Inserimento La funzione d’inserimento in coda PUSHPILA crea un nuovo record nel quale inserisce la nuova informazione e lo attacca in testa alla pila. Si utilizza anche una funzione booleana PILAVUOTA che ci dice se la pila ha o meno elementi

33 Inserimento in C void pushpila (int x) {struct elecoda * nuovo=NULL; nuovo = new( struct elepila); *allocazione*/ nuovo->info=x; nuovo->prox=NULL; if ( pilavuota()) testa=nuovo; else { nuovo-> prox = testa; testa=nuovo; } } NUOVO X ABC TESTA … bool pilavuota () { if (testa==NULL) return true; return false; } x NUOVO TESTA

34 Cancellazione La cancellazione elimina il primo elemento della lista gestita come pila buttando fuori il valore.

35 Cancellazione in C int poppila() { int emergente; emergente=testa->info; testa=testa->prox; return emergente; } ABC EMERGENTE A TESTA