1 ListaDiElem Cancella( ListaDiElem lista, TipoElemento elem ) { ListaDiElem puntTemp; if( ! ListaVuota(lista) ) if( lista–>info == elem ) { puntTemp =

Slides:



Advertisements
Presentazioni simili
Puntatori Linguaggio C.
Advertisements

INFORMATICA Algoritmi fondamentali
Uso avanzato di C.
Sviluppo di programmi strutturati
1 Informatica Generale Susanna Pelagatti Ricevimento: Mercoledì ore presso Dipartimento di Informatica, Via Buonarroti,
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.
Introduzione al linguaggio C
Introduzione al linguaggio C Dr. Francesco Fabozzi Corso di Informatica.
Grafi Algoritmi e Strutture Dati. Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Algoritmi e strutture dati 2/ed 2 Copyright © The McGraw.
Algoritmi in C++ (1) da completare
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.
1 FONDAMENTI DI INFORMATICA II Ingegneria Gestionale a.a ° Ciclo Liste.
PROGRAMMI DI RICERCA E ORDINAMENTO
Esercizi su alberi binari
Tail recursion: esempio
Esercizi su alberi binari di ricerca
Esercizi su strutture dinamiche Fondamenti di Programmazione Canale AD a.a. 2009/2010.
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 Corso di Fondamenti di Programmazione a.a.2009/2010 Prof.ssa Chiara Petrioli Corso.
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2007/2008 Corso di Programmazione 1 a.a.2007/2008 Prof.ssa Chiara Petrioli Corso di Laurea.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Puntatori Marco D. Santambrogio – Ver. aggiornata al 21 Marzo 2013.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Stringhe e Puntatori Marco D. Santambrogio – Ver. aggiornata al 18 Marzo 2013.
Process synchronization
Laboratorio di Linguaggi lezione VI: puntatori 2/3 Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso.
Laboratorio di Linguaggi lezione VIII Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea.
Laboratorio di Linguaggi lezione V Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea in.
Laboratorio di Linguaggi lezione VII: puntatori 3/3 Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso.
Laboratorio di Linguaggi P R I M O C O M P I T I N O Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese.
Laboratorio di Linguaggi lezione IV Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea in.
Modello dati ALBERO Albero: Albero: insieme di punti chiamati NODI e linee chiamate EDGES EDGE: linea che unisce due nodi distinti Radice (root): in una.
Modello dati ALBERO Albero: Albero: insieme di punti chiamati NODI e linee chiamate EDGES EDGE: linea che unisce due nodi distinti Radice (root): in una.
Esercizi su alberi binari
memoria gestita staticamente:
A.A. 2010/2011Ambienti di Programmazione per il Software di Base1 (Es. – 6) Ambienti di Programmazione per il Software di Base Le Stringhe in C Input.
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.
Politecnico di Milano Esercizi Preparazione alla prima prova intermedia.
Le liste dinamiche La ricorsione
Le funzioni.
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.
2000 Prentice Hall, Inc. All rights reserved. Capitolo 12 (Deitel) Le strutture dati dinamiche Sommario Introduzione Allocazione dinamica.
15 maggio 2002 Avvisi: Ultima lezione: mercoledì 29 maggio II Esonero: mercoledì 5 giugno, ora da stabilire.
Corso di informatica Athena – Periti Informatici
Unità Didattica 3 Linguaggio C
Programmazione di Calcolatori
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2007/2008 Corso di Programmazione 1 a.a.2007/2008 Prof.ssa Chiara Petrioli Corso di Laurea.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Array e stringhe Marco D. Santambrogio – Ver. aggiornata al 9 Agosto 2013.
Memoria Dinamica.
Esercizi su File.
Esercizi Liste.
Esercizi su File e Liste
Grafi Rappresentazione mediante liste di adiacenza:
Esercizi su alberi binari di ricerca
Complessità di un algoritmo
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Corso di Programmazione 1 a.a.2006/2007 Prof.ssa Chiara Petrioli Corso di Laurea.
Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 5 Le strutture informative Corso di Informatica 2 a.a. 2003/04 Lezione 5.
ALGORITMI Un algoritmo è un insieme di istruzioni: -ordinate -non ambigue -effettivamente computabili.
Struttura di una lista legata Una lista legata è una variabile strutturata in cui ogni elemento mantiene l’indirizzo (mediante un puntatore) dell’elemento.
Fondamenti di Informatica 2 Ingegneria Informatica Docente: Giovanni Macchia a.a
Esercitazione su Vector. Permette di definire collezioni di dati generiche, che sono in grado di memorizzare elementi di ogni sottotipo di Object Definito.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Puntatori Marco D. Santambrogio – Ver. aggiornata al 11 Ottobre 2014.
Algoritmi e Strutture Dati Strutture Dati Elementari.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Puntatori Marco D. Santambrogio – Ver. aggiornata al 11 Marzo 2014.
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.
Il linguaggio C Puntatori e dintorni.
13. Strutture dati dinamiche Ing. Simona Colucci Informatica - CDL in Ingegneria Industriale- A.A
1 MODULO STRUTTURE DATI FONDAMENTALI: Strutture dinamiche classe 4° INDUSTRIALE INFORMATICA Focus on.
Transcript della presentazione:

1 ListaDiElem Cancella( ListaDiElem lista, TipoElemento elem ) { ListaDiElem puntTemp; if( ! ListaVuota(lista) ) if( lista–>info == elem ) { puntTemp = lista–>prox; free( lista ); return puntTemp; } else lista–>prox = Cancella( lista–>prox, elem ); return lista; } Chiamata : lista1 = Cancella( lista1, elemento ); Cancellazione di un elemento Che cosa succede se nella lista ci sono valori duplicati?

2 ListaDiElem Cancella( ListaDiElem lista, TipoElemento elem ) { ListaDiElem puntTemp; if( ! ListaVuota(lista) ) if( lista–>info == elem ) { puntTemp = lista->prox; free( lista ); return Cancella(PuntTemp, Elem); } else lista–>prox = Cancella( lista–>prox, elem ); return lista; } Variante: elimina tutte le occorrenze

3 Deallocare completamente la lista void DistruggiLista( ListaDiElem lista ) { ListaDiElem temp; while( lista != NULL ) { temp = lista–>prox; free( lista ); lista = temp; } void DistruggiListaRic( ListaDiElem lista ) { if ( ! ListaVuota(lista) ) DistruggiListaRic( lista–>prox ); free( lista ); }

4 ListaDiElem Reverse1( ListaDiElem lista, int keepSource ) { ListaDiElem temp = Inizializza(), curr = lista; while( ! ListaVuota(curr) ) temp = InsInTesta( temp, curr–>info ); curr = curr–>prox; } if( ! keepSource ) DistruggiLista( lista ); return temp; } Chiamate: ListaDiElem s1, s2, s3; s1 = Reverse1( s1, 0 ); s2 = Reverse1( s3, 1 ); Reverse di lista Questa versione alloca, un nodo alla volta, una nuova lista ricopiando via via i valori del campo info nei nuovi nodi. Alla fine, si può deallocare la lista originale o conservarla, in base alla scelta effettuata dal programma chiamante.

5 ListaDiElem Reverse2( ListaDiElem lista ) { ListaDiElem temp, prec = NULL; if( ! ListaVuota(lista) ) { while( lista–>prox != NULL ) { temp = prec; prec = lista; lista = lista–>prox; prec–>prox = temp; } lista–>prox = prec; } return lista; } Reverse di lista Questa versione riusa i nodi della lista passata come parametro, e li rimonta in ordine inverso

6 Se la lista ha 0 o 1 elementi, allora è pari alla sua inversa (e la restituiamo inalterata) Diversamente… supponiamo di saper invertire la coda ( riduciamo il problema da "N" a "N-1"!!! ) – 1–2–3–4–5–6–\ – 1 6–5–4–3–2–\ – Dobbiamo inserire il primo elemento in fondo alla coda invertita – Scriviamo una versione che sfrutti bene i puntatori… Prima della chiamata ricorsiva possiamo mettere da parte un puntatore al secondo elemento [2], confidando che dopo l'inversione esso [2] sarà diventato l'ultimo elemento della "coda invertita", e attaccargli (in coda) il primo elemento [1] Inversione RICORSIVA…

7 ListaDiElem ReverseRic( ListaDiElem lista ) { ListaDiElem p, ris; if ( ListaVuota(lista) || ListaVuota(lista–>prox) ) return lista; else { p = lista–>prox; ris = ReverseRic( p ); p–>prox = lista; lista–>prox = NULL; return ris; } Prima della chiamata ricorsiva possiamo mettere da parte un puntatore [p] al secondo elemento [p=lista->prox], confidando che dopo l'inversione esso sarà diventato l'ultimo elemento della "coda invertita", e attaccargli [p->prox=] (in coda) il primo elemento [lista]

A volte ritornano : inversione di una sequenza di interi Avevamo imparato studiando questo problema che luso degli array può semplificare assai la scrittura dei programmi Restava però irrisolto il problema del pre-dimensionamento opportuno dellarray Ora possiamo pensare di allocare un array dinamico piccolo, e sostituirlo con uno più grande solo se necessario ATTENZIONE: – La malloc() alloca blocchi contigui di memoria ad ogni invocazione, ma invocazioni diverse restituiscono blocchi totalmente scorrelati – Quando un vettore si riempie, quindi, occorre ricopiare nel nuovo vettore la sequenza memorizzata fino a quel punto 8

#define SENTINELLA -1 #define DIM_INIZIALE 100 #define INCREMENTO 50 int main() { int n, *v, lung_max = DIM_INIZIALE, i=0; v = (int *) malloc(lung_max*sizeof(int)); scanf("%d", &n); while( n != SENTINELLA ) { v[i++] = n; if( i == lung_max ) { v = replace( v, lung_max, INCREMENTO ); lung_max += INCREMENTO; } scanf("%d, &n); } printReverse(v, i-1); return 0; } 9

int * replace( int * v, int l_max, int inc ) { int * vet, i; vet = (int *) malloc( sizeof(int)*(l_max+inc) ); for( i=0; i<l_max; i++ ) vet[i] = v[i]; free( v ); return vet; } void printReverse( int v[], int len ) { while( i>0 ) printf("%d", v[i--]); } 10

A volte ritornano : inversione di una sequenza di interi Ora sappiamo usare (quasi) solo la memoria realmente necessaria per la memorizzazione Lo schema di incremento è piuttosto rigido – Si può migliorare per cercare di limitare il numero di ricopiature, man mano che la sequenza si allunga Incrementare / raddoppiare lincremento a ogni incremento Incrementare ogni volta di una percentuale (fissa o variabile) Possiamo ancora migliorare questa soluzione: impareremo come allocare le variabili una alla volta, senza ricopiare mai la sequenza 11

A volte ritornano : inversione di una sequenza di interi Utilizzando una lista, possiamo memorizzare la sequenza allocando un nodo per ogni intero Dove inseriamo i nodi via via che leggiamo gli interi? – In coda? (ultima posizione) Ma per generare la sequenza invertita.... – In testa? (prima posizione) Infatti per generare la sequenza invertita

#define SENTINELLA -1 typedef int TipoElemento; int main() { int n; ListaDiElem lista = Inizializza(); scanf("%d", &n); while( n != SENTINELLA ) { lista = InsInTesta( lista, n ); scanf("%d", &n); } VisualizzaLista(lista); return 0; } 13 Questo è un programma che, mentre acquisisce la sequenza, ha laccortezza di memorizzarla al contrario Possiamo sfruttare il principio per una funzione che realizzi l inversione di una lista data?

A volte ritornano ( poi però basta ) : inversione di una sequenza di interi Vediamo come si può invertire la sequenza SENZA MEMORIZZARLA (cioè... senza usare né array né liste) void inverti() { // non ci sono né array né liste int n; // e neanche assegnamenti scanf("%d", &n); if( n != SENTINELLA ) inverti(); printf("%d ", n); } Ma... è proprio vero che la sequenza non è stata memorizzata? Qual è lo stato dello stack dei record di attivazione nel momento in cui si esegue la prima printf? 14