Strutture dati dinamiche

Размер: px
Начинать показ со страницы:

Download "Strutture dati dinamiche"

Транскрипт

1 Strutture dati dinamiche - Liste concatenate - Pile -> LIFO (last in first out) - Code -> FIFO (first in first out) - Alberi binari: gestione dati in algoritmi complessi Liste Concatenate Formata da elementi creati dinamicamente il cui numero cambia durante l esecuzione. Ogni elemento, o nodo, contiene un puntatore all elemento successivo, mentre il primo elemento, chiamato testa, contiene il puntatore alla lista. L ultimo elemento contiene come puntatore all elemento successivo il valore NULL per indicare che è la fine della lista. La lista è una struttura dati ricorsiva che viene definita utilizzando anche un puntatore a sé stesso. Per definire delle strutture dati ricorsive si usa il TAG, ovvero mette il nome dopo struct. struct nodo { int dato; struct nodo *next; ; struct nodo *newnodo; Si può dichiarare un nodo anche attraverso un tipodato (typedef): da ciò posso fare operazioni del tipo: typedef struct N { int dato; struct N *next; nodo; typedef nodo* Ptrnodo; nodo n1,n2;

2 La possibilità di creare un nuovo nodo per la lista in run-time (ovvero durante l esecuzione), è offerta dalla funzione malloc (memory alloc) che riceve come parametro una dimensione in bit (dimensione da riservare nella memoria dinamica del calcolatore) e ritorna un puntatore a tale spazio. Utile a questo scopo è la funzione sizeof, che riceve in ingresso un tipo di dato e ne ritorna la corrispondente dimensione in bit. L unione di queste due funzioni permette la giusta allocazione in memoria del nodo per la lista. Definito Ptrnodo un puntatore ad un nodo, l allocazione in memoria la eseguiamo nel seguente modo: Ptrnodo ptr = (Ptrnodo) malloc(sizeof(nodo)); Dopo questa istruzione la variabile ptr conterrà l indirizzo di memoria del nodo appena creato; tramite ptr è possibile quindi andare a modificare i valori del nodo stesso. Lavorando in memoria dinamica è presenta anche la funzione free che riceve in ingresso il puntatore del nodo e cancella i dati dalla memoria, liberandola. free(ptr); Sia la funzione malloc che free sono contenute nella libreria stdlib.h che va inclusa all inizio del programma. Nelle pagine successive vedremo come costruire delle funzioni necessarie alla gestione della lista a puntatori.

3 Creazione di un nodo: Cercare un elemento nella lista: L elemento del campo next del nodo precedente permette l accesso a quello successivo. Per fare questo si usa un secondo puntatore che inizialmente lo si fa puntare all inizio della lista e poi lo si sposta in avanti per cercare l elemento desiderato. Inserimento: - Inserimento in testa - Inserimento in coda - Inserimento ordinato int d; Ptrnodo lista, punt; //Creazione della lista, immagine precedente scanf( %d, &d); punt = lista; while(punt!=null && punt->dato!=d){ punt=punt->next; if (punt==null) { printf( Elemento non trovato ); else { printf( Elemento trovato ); Inserimento in testa: Bisogna creare un nuovo elemento quindi si ha bisogno di un puntatore a nodo, segue la creazione della variabile dinamica e la sua inizializzazione. Il campo next del nuovo elemento deve puntare al primo della lista e il puntatore list al nuovo elemento.

4 Ptrnodo instesta (Ptrnodo lista, int el) { Ptrnodo punt = malloc(sizeof(nodo)); punt->dato=el; punt->next=lista; return punt; Nel main o da dove è stata chiamata la funzione si fa: Ptrnodo lista1; int val; lista1=instesta(lista1, val); Inserimento in coda: Si procede in maniera quasi analoga all inserimento in testa. Ptrnodo inscoda (Ptrnodo lista, int el) { Ptrnodo punt, cur; cursore = lista; punt = malloc(sizeof(nodo)); punt->dato=el; punt->next=null; while(cur->next!=null){ cur=cur->next; cur->next=punt; Nel main o dove viene richiamata la funzione: Ptrnodo lista1; int val; lista1=inscoda(lista1, val);

5 Inserimento ordinato: un po più complesso, c è bisogno di un secondo puntatore di appoggio. Ptrnodo insordinato (Ptrnodo lista, int el) { Ptrnodo punt, cur, ptrprec; cur = lista; ptrprec = NULL; punt = malloc(sizeof(nodo)); punt->dato=el; while (cur!=null && el>cur->dato) { ptrprec = cur; cur = cur->next; punt->next = cur; if ( ptrprec!= NULL) { ptrprec->next=punt; else { return punt; Nel main o dove viene richiamata la funzione: Ptrnodo lista1; int val; lista1=inscoda(lista1, val); Cancellazione: Funzione unica che permette la cancellazione di un elemento ricercato nella lista. Ptrnodo cancellaelemento (Ptrnodo lista, int el) { Ptrnodo cur, ptrprec; ptrprec = NULL; for ( cur=lista; cur!=null && cur->dato!=el; cur=cur->next) { ptrprec=cur; if (cur==null) { else if (ptrprec==null) { lista = lista->next; else {

6 ptrprec->next=cur->next; free(cur); LISTE VISTE IN MANIERA RICORSIVA Abbiamo due casi: - Lista vuota - Un nodo più una lista È possibile definire le funzioni che gestiscono la lista in maniera ricorsiva Ptrnodo inizializzazione(void) { return NULL; int listavuota (Ptrnodo lista) { /*Restituisce 1 se vuota, 0 altrimenti*/ if (lista == NULL) { return 1; else { return 0; int dimlista (Ptrnodo lista) { if (listavuota(lista)) { return 0; else { return 1 + dimlista(lista->next); int verifica (Ptrnodo lista, int el) { if (listavuota(lista)) { return 0; if (lista->dato==el) { return 1; return verifica(lista->next, el);

7 Ptrnodo inscoda (Ptrnodo lista, int el) { Ptrnodo punt; if (listavuota(lista)) { punt=malloc(sizeof(nodo)); punt-> dato = el; punt-> next = NULL; return punt; else { lista->next = inscoda(lista->next, el);

Laboratorio di Programmazione

Laboratorio di Programmazione Laboratorio di Programmazione (Laurea triennale in matematica) Lezione 21 Strutture dinamiche Gli array ci permettono di memorizzare un insieme di dati dello stesso tipo Deve essere noto staticamente il

Подробнее

Strutture Dinamiche. Fondamenti di Informatica

Strutture Dinamiche. Fondamenti di Informatica Strutture Dinamiche Fondamenti di Informatica 1 Indice Allocazione e de-allocazione di memoria Liste e loro gestione Companies, srl 2 Allocazione e cancellazione di memoria malloc (sizeof (TipoDato));

Подробнее

Programmazione I - Laboratorio

Programmazione I - Laboratorio Programmazione I - Laboratorio Esercitazione 6 - Liste Gianluca Mezzetti 1 Paolo Milazzo 2 1. Dipartimento di Informatica, Università di Pisa http://www.di.unipi.it/ mezzetti mezzetti di.unipi.it 2. Dipartimento

Подробнее

Esercitazione 11. Liste semplici

Esercitazione 11. Liste semplici Esercitazione 11 Liste semplici Liste semplici (o lineari) Una lista semplice (o lineare) è una successione di elementi omogenei che occupano in memoria una posizione qualsiasi. Ciascun elemento contiene

Подробнее

Liste concatenate e allocazione dinamica

Liste concatenate e allocazione dinamica Liste concatenate e allocazione dinamica Laboratorio di Programmazione I Corso di Laurea in Informatica A.A. 2018/2019 Argomenti del Corso Ogni lezione consta di una spiegazione assistita da slide, e seguita

Подробнее

La struttura dati CODA

La struttura dati CODA Programmazione M-Z Ingegneria e Scienze Informatiche - Cesena A.A. 2016-2017 La struttura dati CODA Pietro Di Lena - [email protected] Introduzione Una coda (o queue) è una struttura dati astratta

Подробнее

E12 Esercizi su Strutture dati dinamiche in C

E12 Esercizi su Strutture dati dinamiche in C E12 Esercizi su Strutture dati dinamiche in C Esercizio 1. Si vuole realizzare una lista caratteri in C utilizzando una rappresentazione semplicemente collegata. Scrivere una struttura nodo che contiene

Подробнее

Linguaggio C. Esercizio 1

Linguaggio C. Esercizio 1 Linguaggio C Esercizi su puntatori e liste Walter Didimo (e-mail:[email protected]) supplemento al Corso di Calcolatori Elettronici (Riccardo Torlone) 1 Esercizio 1 Siano p e q due puntatori a variabili

Подробнее

PILE E CODE. Pile (stack):

PILE E CODE. Pile (stack): PILE E CODE Sono tipi di dato che consentono di rappresentare sequenze di elementi in cui gli inserimenti e le cancellazioni sono eseguiti con particolari modalita` (politiche o discipline). Pile (stack):

Подробнее

Linguaggio C: Strutture e Liste Concatenate Valeria Cardellini

Linguaggio C: Strutture e Liste Concatenate Valeria Cardellini Linguaggio C: Strutture e Liste Concatenate Valeria Cardellini Corso di Calcolatori Elettronici A.A. 2018/19 Università degli Studi di Roma Tor Vergata Dipartimento di Ingegneria Civile e Ingegneria Informatica

Подробнее

Strutture dati dinamiche in C (II)

Strutture dati dinamiche in C (II) Strutture dati dinamiche in C (II) Laboratorio di Linguaggi di Programmazione a.a. 2001/2002 dott.ssa Francesca A. Lisi [email protected] Sommario Le liste concatenate (ancora ma in modo più formale) L

Подробнее

Il linguaggio C. Puntatori e dintorni

Il linguaggio C. Puntatori e dintorni Il linguaggio C Puntatori e dintorni 1 Puntatori : idea di base In C è possibile conoscere e denotare l indirizzo della cella di memoria in cui è memorizzata una variabile (il puntatore) es : int a = 50;

Подробнее

Gestione dinamica della memoria

Gestione dinamica della memoria Programmazione M-Z Ingegneria e Scienze Informatiche - Cesena A.A. 2016-2017 Gestione dinamica della memoria Pietro Di Lena - [email protected] A pessimistic programmer sees the array as half empty.

Подробнее

L'Allocazione Dinamica della Memoria nel linguaggio C

L'Allocazione Dinamica della Memoria nel linguaggio C L'Allocazione Dinamica della Memoria nel linguaggio C Prof. Rio Chierego [email protected] http://www.riochierego.it/informatica.htm Sommario Questo documento tratta l'allocazione dinamica della memoria

Подробнее

Inserimento in una lista ordinata

Inserimento in una lista ordinata Inserimento in una lista ordinata Vogliamo inserire un nuovo elemento in una lista in cui gli elementi sono memorizzati in ordine crescente: Passo 1: creare un nuovo nodo della lista Passo 2: trovare il

Подробнее

Hash Table. Hash Table

Hash Table. Hash Table Hash Table La ricerca di un elemento su una lista (semplice o doppia) presenta una complessità di tipo O(n), dato che occorre scandire (al più) l intera lista per poter trovare l elemento desiderato. Le

Подробнее

Questa soluzione va contemplata quando le lunghezze stimate dalle liste usate sono significativamente maggiori delle dimensioni di un elemento.

Questa soluzione va contemplata quando le lunghezze stimate dalle liste usate sono significativamente maggiori delle dimensioni di un elemento. Un ulteriore semplificazione si ottiene utilizzando un elemento sentinella (dummy) che non contiene informazione, ma serve a segnalare la fine (e l inizio) di una lista. Questa soluzione va contemplata

Подробнее

La Struttura Dati Lista

La Struttura Dati Lista La Struttura Dati Lista Introduzione Nella definizione di un programma mirato alla risoluzione di un determinato problema, la scelta delle strutture dati è di fondamentale importanza per un efficiente

Подробнее

Esercizi Strutture dati di tipo astratto

Esercizi Strutture dati di tipo astratto Salvatore Cuomo Esercizi Strutture dati di tipo astratto Lezione n. 20 Parole chiave: Strutture dati, pile code, liste Corso di Laurea: Informatica Insegnamento: Programmazione II, modulo di Laboratorio

Подробнее

Lezione 8 Struct e qsort

Lezione 8 Struct e qsort Lezione 8 Struct e qsort Rossano Venturini [email protected] Pagina web del corso http://didawiki.cli.di.unipi.it/doku.php/informatica/all-b/start Esercizio 3 QuickSort strambo Modificare il Quicksort

Подробнее

5. Quinta esercitazione autoguidata: liste semplici

5. Quinta esercitazione autoguidata: liste semplici 22 5. Quinta esercitazione autoguidata: liste semplici 5.1. Liste rappresentate mediante strutture e puntatori (LISTE1.C, LISTE2.C) Scrivere un programma che - costruisce una lista di k interi (con k letto

Подробнее

Consideriamo un vettore allocato dinamicamente

Consideriamo un vettore allocato dinamicamente Libreria per per la la gestione/manipolazione dei dei vettori Consideriamo un vettore allocato dinamicamente int * v; v = (int *) malloc (n * sizeof (int) ); Conversione di tipo da void * a int * Numero

Подробнее

Allocazione dinamica della memoria

Allocazione dinamica della memoria Università degli Studi di Milano Corso di Laurea in Informatica, A.A. 2017-2018 Allocazione dinamica della memoria Homepage del corso Turno A Nicola Basilico Dipartimento di Informatica Via Comelico 39/41-20135

Подробнее

Struct e liste concatenate

Struct e liste concatenate Struct e liste concatenate Alessio Orlandi 20 aprile 2010 Tipi complessi Tipi scalari: int, float,... : singolo elemento Contenitori per collezioni di oggetti: array. Quindi: array di interi, array di

Подробнее

Implementazione di Liste puntate

Implementazione di Liste puntate Laboratorio di Algoritmi e Strutture Dati Aniello Murano http://people.na.infn.it people.na.infn.it/~murano/ 1 Implementazione di Liste puntate 2 1 Indice Liste puntate semplici: Gli elementi sono logicamente

Подробнее

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

Laboratorio di Calcolatori 1 Corso di Laurea in Fisica A.A. 2006/2007 Laboratorio di Calcolatori 1 Corso di Laurea in Fisica A.A. 2006/2007 Dott.Davide Di Ruscio Dipartimento di Informatica Università degli Studi di L Aquila Lezione del 08/03/07 Nota Questi lucidi sono tratti

Подробнее