Gest ione di list e in C



Похожие документы
Laboratorio di Calcolatori 1 Corso di Laurea in Fisica A.A. 2006/2007

Laboratorio di Programmazione

Allocazione dinamica della memoria - riepilogo

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

La struttura dati ad albero binario

Il tipo di dato astratto Pila

La ricorsione. Politecnico di Milano Sede di Cremona

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2

LISTE, INSIEMI, ALBERI E RICORSIONE

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2

Compito di Fondamenti di Informatica

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

La gestione della memoria

Gestione dinamica di una pila

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

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

Lezione 9: Strutture e allocazione dinamica della memoria

INFORMATICA 1 L. Mezzalira

Algoritmi e Strutture Dati

Strutture Dinamiche. Fondamenti di Informatica

dall argomento argomento della malloc()

Alberi binari di ricerca

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2

Algoritmi di Ricerca. Esempi di programmi Java

Le operazioni di allocazione e deallocazione sono a carico del sistema.

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

Funzioni in C. Violetta Lonati

ARRAY BIDIMENSIONALI float [][] mx = new float[3][4]; (float []) [] mx = new float[3][4];

Laboratorio di Algoritmi e Strutture Dati

I puntatori e l allocazione dinamica di memoria

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

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

Appello di Informatica B

Breve riepilogo della puntata precedente:

Algoritmi su array / 2

Laboratorio di Algoritmi e Strutture Dati

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

10 - Programmare con gli Array

FONDAMENTI di INFORMATICA L. Mezzalira

Corso di Fondamenti di Informatica Algoritmi su array / 2

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

Strutture dati dinamiche

Tipi di Dato Ricorsivi

13 - Gestione della Memoria nella Programmazione Orientata agli Oggetti

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:

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2

SAPIENZA Università di Roma, Facoltà di Ingegneria

I tipi di dato astratti

Esercizio: gestione di un conto corrente

Inizializzazione, Assegnamento e Distruzione di Classi

Laboratorio di Algoritmi e Strutture Dati

Corso di Laurea in Ingegneria Gestionale Esame di Informatica - a.a luglio 2013

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

Gli array. Gli array. Gli array. Classi di memorizzazione per array. Inizializzazione esplicita degli array. Array e puntatori

Linguaggio C - Stringhe

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

Esercizi Capitolo 6 - Alberi binari di ricerca

GESTIONE INFORMATICA DEI DATI AZIENDALI

Verifica che una grammatica sia Context Free nel GrammaReader

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

Fondamenti di Informatica e Laboratorio T-AB T-16 Progetti su più file. Funzioni come parametro. Parametri del main

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

Corso di Fondamenti di Informatica

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

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

Algoritmi e Strutture Dati & Laboratorio di Algoritmi e Programmazione

Grammatica di base: Pointers

Indirizzo di una funzione. Puntatori a funzioni. Definizione di variabili. Definizione di variabili

costruttori e distruttori

Lab 11 Gestione file di testo"

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

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

RICORSIVITA. Vediamo come si programma la soluzione ricorsiva al problema precedente: Poniamo S 1 =1 S 2 =1+2 S 3 =1+2+3

Fondamenti di Informatica 1. Prof. B.Buttarazzi A.A. 2010/2011

Laboratorio di Fondamenti di Informatica anno accademico Esercizi proposti il

Utilizzo e scrittura di classi

Le funzioni in C. I programmi C sono costituiti da definizioni di variabili e funzioni.

Programmazione dinamica

Dynamic Linking. Introduzione Creazione di una libreria dinamica Uso di una libreria dinamica

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

CREARE UNA LIBRERIA IN C

Informatica 3. LEZIONE 23: Indicizzazione. Modulo 1: Indicizzazione lineare, ISAM e ad albero Modulo 2: 2-3 trees, B-trees e B + -trees

puntatori Lab. Calc. AA 2007/08 1

Visibilità dei Membri di una Classe

Record in C: il costruttore struct.

Esercitazione 10. Strutture ed Enumerazioni. Allocazione dinamica di memoria

Politecnico di Milano. Ingegneria del Software a.a. 2006/07. Appello del 14 settembre 2007 Cognome Nome Matricola

Esercizio 6 Realizzare una classe astratta per le Figure piane e due sottoclassi, la sottoclasse Quadrato e la sottoclasse Rettangolo.

La prima applicazione Java. Creazione di oggetti - 1. La prima applicazione Java: schema di esecuzione. Gianpaolo Cugola - Sistemi Informativi in Rete

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

Algoritmi e strutture dati. Codici di Huffman

Esercizi della lezione 5 di Java

Транскрипт:

Gest ione di list e in C Politecnico di Milano Sede di Cremona Gianpaolo Cugola Dipartimento di Elettronica e Informazione cugola@elet.polimi.it http://www.elet.polimi.it/~cugola Strutture dinamiche Gli array ci permettono di memorizzare un insieme di dati dello stesso tipo Deve essere noto staticamente il numero massimo di dati da memorizzare C è uno spreco di memoria ogni qual volta la quantità di dati effettivamente da memorizzare sia inferiore al numero massimo previsto È utile poter costruire strutture dati capaci di crescere al crescere delle necessità del programma e di liberare memoria quando non è più necessaria Informatica A - Cugola 2

Strutture dinamiche Il C offre due importanti funzioni (in stdlib.h) malloc Richiede come parametro la dimensione dell oggetto creato Restituisce un puntatore all oggetto free Richiede come parametro il puntatore a un oggetto creato da malloc Rende la memoria utilizzata dall oggetto disponibile per nuovi oggetti Si usa lo heap Informatica A - Cugola 3 Strutture dinamiche Vantaggi: Si creano solo i contenitori che servono per la particolare istanza del problema Aumenta la flessibilità d uso Svantaggi L uso è più complesso Si possono creare dangling pointers Informatica A - Cugola 4

Liste Sono le strutture dinamiche più semplici Una lista è composta da un insieme di nodi Ciascun nodo contiene: Un dato Il puntatore al nodo successivo Informatica A - Cugola 5 Nodi e liste Nodo info prox 5 8 2 4 Lista contenente 4 elementi Informatica A - Cugola 6

Le liste in C typedef struct Nodo { TipoElemento info; struct Nodo *prox; Nodo; typedef Nodo *Lista; Informatica A - Cugola 7 Inizializzazione Lista inizializza() { return NULL; Lista lista; lista = inizializza(); Informatica A - Cugola 8

Inizializzazione forma alternativa void inizializza(lista *l) { *l = NULL; Lista lista; inizializza(&lista); Informatica A - Cugola 9 Controllo lista vuota boolean listavuota(lista l) { return l == NULL; Lista lista; if(listavuota(lista)) Informatica A - Cugola 10

Inserimento in testa Lista inserisciintesta(lista l, TipoElemento el){ Nodo *temp; temp >info = el; temp >prox = l; return temp; i2 lista = inserisciintesta(lista, i1); lista = inserisciintesta(lista, i2); i1 Informatica A - Cugola 11 Inserimento in testa forma alternativa void inserisciintesta(lista *l, TipoElemento el){ Nodo *temp; temp >info = el; temp >prox = *l; *l=temp; inserisciintesta(&lista, i1); inserisciintesta(&lista, i2); i2 i1 Informatica A - Cugola 12

Inserimento in coda Lista inserisciincoda(lista l, TipoElemento el) { Nodo *temp; if (listavuota(l)) { temp->info = el; temp->prox = NULL; return temp; else { for(temp=l; temp->prox!=null; temp=temp->prox) ; temp->prox = malloc(sizeof(nodo)); temp->prox->info = el; temp->prox->prox = NULL; return l; lista = inserisciincoda(lista, i1); lista = inserisciincoda(lista, i2); i1 i2 Informatica A - Cugola 13 Inserimento in coda forma alternativa void inserisciincoda(lista *l, TipoElemento el) { Nodo *temp; if (listavuota(*l)) { temp->info = el; temp->prox = NULL; *l = temp; else { for(temp=*l; temp->prox!=null; temp=temp->prox) ; temp->prox = malloc(sizeof(nodo)); temp->prox->info = el; temp->prox->prox = NULL; i1 i2 inserisciincoda(&lista, i1); inserisciincoda(&lista, i2); Informatica A - Cugola 14

Inserimento in coda forma ricorsiva Lista inserisciincoda(lista l, TipoElemento el) { Nodo *temp; if (listavuota(l)) { temp >info = el; temp >prox = NULL; return temp; else { l->prox = inserisciincoda(l >prox, el); return l; lista = inserisciincoda(lista, i1); lista = inserisciincoda(lista, i2); i1 i2 Informatica A - Cugola 15 Inserimento in ordine Lista inserisciinordine(lista l, TipoElemento el) { Nodo *temp, *puntcorrente, *puntprecedente; puntprecedente = NULL; for(puntcorrente=l; puntcorrente!=null && el>puntcorrente->info; puntcorrente=puntcorrente->prox) { puntprecedente = puntcorrente; temp->info = el; temp->prox = puntcorrente; if (puntprecedente!= NULL ) { /* Inserimento interno alla lista */ puntprecedente->prox = temp; return l; else return temp; /* Inserimento in testa alla lista */ lista = inserisciinordine(lista, i2); lista = inserisciinordine(lista, i1); i1 i2 Informatica A - Cugola 16

Inserimento in ordine forma alternativa void inserisciinordine(lista *l, TipoElemento el) { Nodo *temp, *puntcorrente, *puntprecedente; puntprecedente = NULL; for(puntcorrente=*l; puntcorrente!=null && el>puntcorrente->info; puntcorrente=puntcorrente->prox) { puntprecedente = puntcorrente; temp->info = el; temp->prox = puntcorrente; if (puntprecedente!= NULL ) { /* Inserimento interno alla lista */ puntprecedente->prox = temp; else *l = temp; /* Inserimento in testa alla lista */ inserisciinordine(&lista, i2); inserisciinordine(&lista, i1); i1 i2 Informatica A - Cugola 17 Cancellazione di un elemento Lista cancella(lista l, TipoElemento el) { Nodo *temp, *puntcorrente, *puntprecedente; if(listavuota(l)) return l; if(l->info==el) { temp = l; l = l->prox; free(temp); else { puntprecedente=null; for(puntcorrente=l; puntcorrente!=null && puntcorrente->info!=el; puntcorrente=puntcorrente->prox) { puntprecedente = puntcorrente; if(puntcorrente!=null && puntcorrente->info==el) { temp=puntcorrente; puntprecedente->prox = puntcorrente->prox; free(temp); return l; Informatica A - Cugola 18

Cancellazione di un elemento forma alternativa void cancella(lista *l, TipoElemento el) { Nodo *temp, *puntcorrente, *puntprecedente; if(listavuota(*l)) return; if((*l)->info==el) { temp = *l; *l = (*l)->prox; free(temp); else { puntprecedente=null; for(puntcorrente=*l; puntcorrente!=null && puntcorrente->info!=el; puntcorrente=puntcorrente->prox) { puntprecedente = puntcorrente; if(puntcorrente!=null && puntcorrente->info==el) { temp=puntcorrente; puntprecedente->prox = puntcorrente->prox; free(temp); Informatica A - Cugola 19 Esercizi Si scriva la funzione cancella per il caso delle liste ordinate (si sfrutti l ordinamento per semplificare la ricerca) Si scriva una funzione cancellatutti che cancella tutte le occorrenze di un dato elemento da una lista Si scriva una funzione cerca che restituisce true se un dato elemento è presente nella lista passata come parametro Si riscrivano le funzioni di inserimento in ordine e cancellazione in forma ricorsiva Informatica A - Cugola 20