Strutture dati dinamiche
|
|
|
- Liliana Pappalardo
- 6 anni fa
- Просмотров:
Транскрипт
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 (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 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 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 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 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
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 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 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 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 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) 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 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
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 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 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 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.
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 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
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 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
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
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
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 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
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 Dott.Davide Di Ruscio Dipartimento di Informatica Università degli Studi di L Aquila Lezione del 08/03/07 Nota Questi lucidi sono tratti
