Dipartimento di Elettronica, Informazione e Bioingegneria API 2013/4
|
|
- Eugenia Beretta
- 6 anni fa
- Visualizzazioni
Transcript
1 Dipartimento di Elettronica, Informazione e Bioingegneria API 2013/4 Array, liste, pile, G. Gini 2013
2 Dati ricorsivi costruttore istruzione tipo dato atomo assegnamento variabile enumerazione istruzione composta struct ripetizione nota for array scelta if struct ripetizione ignota while file ricorsione funzione dati ricorsivi grafo go to puntatori Strutture statiche o dinamiche?
3 LISTE Una lista e una struttura dati ricorsiva che consente di accorpare elementi della stessa tipologia mantenendoli in ordine logico (non fisico) Definizione: Dato un insieme di valori U, chiamiamo lista una seq uenza finita L di elementi di U. L può essere la lista vuota, denotata con il simbolo Λ; altrimenti L è una sequenza finita della forma L = (a1, a2,..., an), dove n >= 1 e ai U per ogni i = 1, 2,..., n. <lista>::= Λ <elemento><lista> Il tipo di dato astratto lista è definito da: notazione insieme di primitive
4 Primitive su lista costruttore di lista lista_vuota? NULL? (lista). primo_elemento della lista: si puo fare se la lista non e vuota, e restituisce un elemento. PRIMO_EL (lista) resto della lista tolto il primo elemento: restituisce una lista accorciata. RESTO (lista) attacca_elemento_in_testa ad una lista. CONS (e, lista) aggiunge e all'inizio di lista. NULL?() -> vero PRIMO_EL (e1, e2, e3) -> e1 RESTO (e1, e2, e3) -> (e2, e3) CONS (e0, lista) -> (e0, e1, e2, e3)
5 Es1: restituisci l elemento di posto n definire la funzione nth che prende come argomenti un intero n ed una lista e ritorna l'ennesimo elemento della lista (numerata a partire da 0). - se n=0, restituisce primo_el altrimenti ritorna l'(n-1) elemento del resto della lista item nth (int n, list-item x) if n=0 then return PRIMO_EL (x) else return (nth (n-1, RESTO (x)) Computazione di nth( 2 ( )) = > nth(1 ( ))=> nth(0 (2 3 4)) RETURN 2
6 Es 2: restituisci la lunghezza della lista int lunghezza (list-item x) if NULL? (x) then return 0 else return lunghezza (RESTO( x)) + 1 Computazione: lunghezza(0 1 2) lunghezza(1 2) + 1 lunghezza(2)+1 +1 lunghezza() return 0 return 1 return 2 return 3
7 Es3 : inserimento in ordine In una lista ordinata il nuovo elemento viene inserito nella lista quando si e raggiunta la posizione voluta. Se l elemento è minore del primo della lista, va messo in testa insert-crescente( item x, list-item y) if NULL? (y) then return (list x) if x < PRIMO_EL(y) then return CONS(x y) else return CONS (PRIMO_EL( y), insert-crescente (x, RESTO(y)))
8 RAPPRESENTAZIONI GRAFICHE e puntatori E opportuno vedere la lista come composta da scatole doppie, che contengono per ogni elemento l elemento stesso ed un modo per raggiungere l elemento successivo (puntatore). la lista e caratterizzata da un puntatore d accesso la lista può essere scandita solo dall inizio alla fine; la fine è contrassegnata da un puntatore finale nullo. In genere i linguaggi imperativi non hanno la lista come struttura dati direttamente disponibile, e possono implementare la lista in diversi modi: 1. Rappresentazione mediante arrays 2. Rappresentazione mediante puntatori.
9 esempio Lista di tre elementi E1 P1 E2 P2 E3 NULL
10 Liste in array La rappresentazione mediante array richiede array di record - il primo campo e l elemento - il secondo e l indice in cui trovare il prossimo elemento es: rappresentiamo in C in un array di 10 righe e 2 colonne la lista di interi (e1, e2, e3) - puntatore d accesso = 1 - segno di fine lista: -1 typedef struct{ int pos; int info;elemlista; ElemLista MIA_lista [10]; 0 e3-1 1 e1 5 2 * * 3 * * 4 * * 5 e2 0 6 * * 7 * * 8 * * 9 * *
11 Array e lista libera P LL 0 e3-1 1 e1 5 2 * 6 3 * 2 4 * 7 5 e2 0 6 * 4 7 * 8 8 * 9 9 * -1 per poter inserire elementi e opportuno che le posizioni non usate siano collegate a lista, (lista libera). Nella stessa array allora convivono due liste, la lista delle informazioni e la lista libera. In questo caso il puntatore lista libera = 3
12 Strutture dati dinamiche in C strutture nelle quali è possibile modificare le dimensioni aggiungendo o togliendo elementi allocando o deallocando memoria l accesso alle componenti non sempre è il risultato di una sola operazione ma può richiedere l esecuzione di un numero di passi proporzionale alla dimensione della struttura stessa.
13 Allocazione e Rilascio di memoria Si alloca memoria solo quando occorre inserire dati Si libera memoria quando il dato non serve più in C occorre introdurre funzioni che fanno riferimento a variabili di tipo puntatore Si allocano o deallocano durante l esecuzione del programma Sono anonime (si accede mediante puntatori, non hanno un nome) Occorrono le funzioni della <stdlib.h> malloc per allocazione prende celle da heap free per rilascio di memoria (torna in heap)
14 Gestione della memoria La memoria riservata ai dati del programma è partizionata in due "zone" pila (stack) per var. statiche e automatiche mucchio (heap) per var. dinamiche Esempio int * Punt1; int ** Punt2;
15 malloc e free TipoDato *punt; punt = malloc (sizeof(tipodato)); Dichiara punt come puntatore a TipoDato Crea in memoria la variabile del tipo TipoDato Restituisce l indirizzo della variabile creata (NULL se heap esaurito) Assegna questo indirizzo a punt, che ora punta alla variabile dinamica free(punt); Rilascia lo spazio puntato da punt per tanti bytes quanto indicato da TipoDato N.B.: non serve specificare la dimensione in byte, che è intrinsecamente derivabile dal tipo della variabile allocata sizeof Ritorna la grandezza in bytes dell operando
16 Puntatori "ciondolanti" dangling references Sono puntatori a zone di memoria deallocate ( a variabili dinamiche "non più esistenti") Sono più gravi della produzione di garbage: portano a veri e propri errori Alcuni linguaggi (LISP, SCHEME, Java) non hanno una operazione free(), ma un garbage collector - Un componente della macchina astratta che trova e riutilizza la memoria inaccessibile (non più referenziata)
17 Problemi coi puntatori è possibile programmare molto male generando effetti difficili da "tracciare" in modo che il funzionamento del programma dipenda da come uno specifico sistema gestisce la memoria Lo stesso programma, se scritto "male", può funzionare in modo diverso su macchine diverse
18 Puntatori per la lista Lista Si definisce Lista, il puntatore alla lista la memoria viene allocata per l elemento da inserire E1 P1 E2 P2 E3 NULL
19 Dichiarazione di lista typedef struct EL { TipoDato Info; struct EL *Prox; ElemLista; typedef ElemLista *ListaDiElem; ListaDiElem Lista; struct EL definisce i campi di ogni elemento typedef rinomina il tipo structel come ElemLista typedef definisce il nuovo tipo ListadiElem come puntatore al tipo ElemLista Lista é perciò il puntatore alla lista
20 Funzioni di base in C - 1 Inizializzazione con variable globale Lista = NULL; con procedura su variabile globale void Inizializza (void) { Lista = NULL;
21 Funzioni di base in C - 2 Lista vuota? int ListaVuota (ListadiElem Lista) /* Lista, passata per valore, punta al primo elemento*/ { if (Lista == NULL) return 1; else return 0; Esempio di chiamata: int vuota; vuota = ListaVuota (Lista);
22 Funzioni di base in C - 3 Prendi il primo elemento di una lista - di tipo int int PrimoElem (ListadiElem Lista) { if (ListaVuota(Lista)== false) return Lista->Info else return error ; Lista->Info è scrittura abbreviata per accedere al campo Info della variabile dereferenziata *Lista Lista->Info equivale a *Lista.Info (ListaVuota(Lista)== false) equivale a (Lista!= NULL)
23 Funzioni di base in C - 4 Prendi il resto della lista tolto il primo elemento ListaDiElem RestoLista (ListadiElem Lista) { if(lista!= NULL) /*ci sono elementi*/ return Lista->Prox else return error ; Lista->Prox è scrittura abbreviata per accedere al campo Prox della variabile dereferenziata *Lista è equivalente a *Lista.Prox
24 Esempio: ricerca elemento Scandire una lista di interi fino a trovare o l'elemento o la fine lista boolean Ricerca (ListadiElem Lista, int Cercare) {while (Lista!= NULL)/*non vuota*/ {if (Lista->Info == Cercare) return true; Lista = Lista->Prox;/*by value*/ return false;
25 -> ricerca ricorsiva Se Lista vuota return false altrimenti return ricerca (resto Lista) boolean Ricerca (ListadiElem Lista, int Cercare) { if (Lista == NULL) return false; if (Lista->Info == Cercare) return true; else return Ricerca (Lista-> Prox, Cercare);
26 Funzioni di base in C 5 Inserire in testa Lista punt elem Alloco una scatola per elem A prox assegno Lista A Lista assegno punt
27 Inserimento in testa (passaggio per valore) ListaDiElem InserisciTesta (ListadiElem Lista, int Elem) { ElemLista * punt; punt = malloc (sizeof(elemlista)); punt->info = Elem; punt->prox = Lista; return punt; chiamata: Lista = InserisciTesta (Lista, new);
28 Inserimento in testa (passaggio per indirizzo) Inserimento in testa (come procedura, passaggio per indirizzo) void InserisciTesta (ListadiElem *Lista, int Elem) { ElemLista *punt; punt = malloc (sizeof(elemlista)); punt->info = Elem; punt->prox = *Lista; *Lista = punt; *Lista é indirizzo primo elemento della lista
29 Inserimento in coda (ricorsivo) ListaDiElem InserisciCoda(ListadiElem Lista, int Elem) { ElemLista *punt; if (ListaVuota(Lista)) {punt = malloc (sizeof(elemlista)); punt->info = Elem; punt->prox = NULL; return punt; else {Lista->Prox=InserisciCoda(Lista>Prox, Elem); return Lista;/*il puntatore a lista*/ chiamata: Lista = InserisciCoda (Lista, Nuovo); return InserisciTesta(ListadiElem lista, int Elem);
30 Inserimento in ordine ListaDiElem InserisciOrdine(ListadiElem Lista, int Elem) { Elemlista *punt, *puntcorr, *puntprec; puntprec = NULL; puntcorr = Lista; while (puntcorr!=null&&elem>puntcorr->info) /*va avanti*/ {puntprec = puntcorr; puntcorr = puntcorr->prox; /*ci siamo*/ punt = malloc (sizeof(elemlista)); punt->info = Elem; punt->prox = puntcorr; if (puntprec!= NULL) /* siamo all' interno*/ {puntprec->prox= punt; return Lista; else return punt; /*è in testa*/ chiamata Lista = InserisciOrdine (Lista,new);
31
32 Cancellazione di elemento (ricorsiva) ListaDiElem Cancella (ListadiElem Lista, int Togli) {ElemLista *puntemp; if (ListaVuota(Lista)== false)/*ci sono elementi*/ {if(lista->info == Togli)/* trovato*/ {puntemp = Lista->Prox; free (Lista); return puntemp; else {Lista->Prox = Cancella(Lista->Prox, Togli); return Lista; else return Lista ;*/è vuota*/ chiamata : Lista = Cancella(Lista, Elem);
33 #include <stdio.h> #include <stdlib.h> struct listnode { char data; struct listnode *nextptr; ; typedef struct listnode ListNode; typedef ListNode *ListNodePtr; /*tipo dato lista*/ void insert( ListNodePtr *, char ); /*prototipi*/ char delete( ListNodePtr *, char ); int isempty( ListNodePtr ); void printlist( ListNodePtr ); void instructions( void ); Programma completo Usa procedure e chiamate per indirizzo main() { ListNodePtr startptr = NULL; int choice; char item; instructions(); /* mostra il menu */ printf( "? " ); scanf( "%d", &choice );
34 while ( choice!= 3 ) { switch ( choice ) { case 1: printf( "Enter a character: " ); scanf( "\n%c", &item ); insert( &startptr, item ); printlist( startptr ); break; case 2: if (!isempty( startptr ) ) { printf( "Enter character to be deleted: " ); scanf( "\n%c", &item ); if ( delete( &startptr, item ) ) { printf( "%c deleted.\n", item ); printlist( startptr ); else printf( "%c not found.\n\n", item ); else printf( "List is empty.\n\n" ); break; default: printf( "Invalid choice.\n\n" ); instructions(); break;
35 printf( "? " ); scanf( "%d", &choice ); printf( "End of run.\n" ); /* stampa il menu */ void instructions( void ) { printf( "Enter your choice:\n" " 1 to insert an element into the list.\n" " 2 to delete an element from the list.\n" " 3 to end.\n" ); /* inserisci in ordine un valore nella lista */ void insert( ListNodePtr *sptr, char value ) { ListNodePtr newptr, previousptr, currentptr; newptr = malloc( sizeof( ListNode ) ); if ( newptr!= NULL ) { newptr->data = value; newptr->nextptr = NULL; previousptr = NULL; currentptr = *sptr;
36 while ( currentptr!= NULL && value > currentptr->data ) { previousptr = currentptr; currentptr = currentptr->nextptr; if ( previousptr == NULL ) { newptr->nextptr = *sptr; *sptr = newptr; else { previousptr->nextptr = newptr; newptr->nextptr = currentptr; else printf( "%c not inserted. No memory available.\n", value ); /* cancella un elemento */ char delete( ListNodePtr *sptr, char value ) { ListNodePtr previousptr, currentptr, tempptr; if ( value == ( *sptr )->data ) { tempptr = *sptr; *sptr = ( *sptr )->nextptr; /* stacca il nodo */ free( tempptr ); /* cancella */ return value;
37 else { previousptr = *sptr; currentptr = ( *sptr )->nextptr; while ( currentptr!= NULL && currentptr->data!= value ) { previousptr = currentptr; currentptr = currentptr->nextptr; if ( currentptr!= NULL ) { tempptr = currentptr; previousptr->nextptr = currentptr->nextptr; free( tempptr ); return value; /* lista vuota?*/ int isempty( ListNodePtr sptr ) { return sptr == NULL; /* stampa la lista */ void printlist( ListNodePtr currentptr ) { if ( currentptr == NULL )
38 printf( "List is empty.\n\n" ); else { printf( "The list is:\n" ); while ( currentptr!= NULL ) { printf( "%c --> ", currentptr->data ); currentptr = currentptr->nextptr; printf( "NULL\n\n" ); Enter your choice: 1 to insert an element into the list. 2 to delete an element from the list. 3 to end.? 1 Enter a character: B The list is: B --> NULL? 1 Enter a character: A The list is: A --> B --> NULL? 1 Enter a character: C The list is: A --> B --> C --> NULL? 2 Enter character to be deleted: D D not found.? 2 Enter character to be deleted: B B deleted. The list is: A --> C --> NULL
39 visita di lista void printlista( ListaDiElem currentptr ) { if ( currentptr == NULL ) printf( Lista vuota.\n\n" ); else { printf( La lista è:\n" ); while ( currentptr!= NULL ) { printf( "%d --> ", currentptr->info ); currentptr = currentptr->nextptr; printf( "NULL\n\n" );
40 Esercizio 1 Si scriva una funzione C ricorsiva che data una lista l restituisce 1 se la lista è ordinata, 0 altrimenti. La lista vuota si ritiene ordinata, così come la lista contenente un solo elemento. Si consideri ad esempio la seguente lista: La funzione restituirà il valore 1, poiché ogni elemento contiene un valore maggiore dell elemento precedente. l
41 Soluzione 1 int list_is_ordered(listadielem L) { if (L == NULL) return 1; if (L->prox == NULL) return 1; return list_is_ordered(l->prox)&& (L->info < L->prox->info);
42 le liste semplici Cominciano con un puntatore al primo nodo Terminano con null Si attraversano in una sola direzione APPLICAZIONI: processi in SO, elenchi, Dato e puntatore NULL (punta a nulla
43 Pila (o stack) È una struttura dati con accesso limitato all elemento "in cima", che è quello inserito più recentemente (LIFO: last in, first out) Nomi standard delle operazioni primitive: Push Inserimento in cima Pop prelievo e rimozione dell elemento in cima, che è per definizione l'ultimo elemento inserito Top o Peek Prelievo senza rimozione (cioè "sola lettura") dell'elemento in cima
44 Applicazioni della pila Controllo di bilanciamento di simboli (parentesi, tag XML, blocchi C, ) Per ogni simbolo di "apertura" si impila un segnaposto che sarà rimosso quando si incontra il simbolo duale di "chiusura" Se il simbolo non corrisponde al segnaposto sulla pila, allora la sequenza non è bilanciata Esempio: {[][{[](){](){[()]()[{] ok {[{] () ko Implementazione di chiamate a funzione Pila di sistema e record di attivazione Valutazione di espressioni aritmetiche
45 Pila (o stack): implementazione PILA (stack): I nuovi nodi possono essere aggiunti e cancellati solo dalla cima (top) della pila La base della pila è indicata da un puntatore a NULL È una versione vincolata della lista concatenata: solo inserimento e cancellazione in testa push Aggiunge un nuovo nodo alla cima della pila Non restituisce nulla al chiamante (void) - restituisce il puntatore- MEGLIO! pop Cancella un nodo dalla cima della pila Memorizza il valore cancellato Restituisce un valore booleano al chiamante true se l operazione ha avuto successo NULL
46 Dichiarazione di stack (di interi) typedef struct stacknode { int Info; struct stacknode *Prox; Node; typedef Node *Stack; Stack pila1; struct definisce i campi di ogni elemento typedef rinomina il tipo structstacknode come Node typedef definisce il nuovo tipo Stack come puntatore al tipo Node pila é perciò il puntatore allo stack
47 push (come funzione, passaggio per valore) Stack Push (Stack pila, int el) { Node * punt; punt = malloc (sizeof(node)); punt->info = el; punt->prox = pila1; return punt; chiamata: pila1 = Push (pila1, new); pila = punt pila e l
48 Pop deve modificare il puntatore d accesso e restituire il valore in cima allo stack occorre una chiamata per reference int Pop (Stack *pila) {Stack temp; int popval; temp = *pila /*metto in temp l indirizzo del primo byte della pila */ popval = (*pila)->info; *pila = (*pila)->prox; free (temp); return popval; chiamata :testa = Pop(&pila1);
49 Implementazione completa in C void push( StackNodePtr *, int ); int pop( StackNodePtr * ); int isempty( StackNodePtr ); void printstack( StackNodePtr ); void instructions( void );
50 int main() { StackNodePtr stackptr = NULL; /* punta alla cima della pila */ int choice, value; do { instructions(); scanf( "%d", &choice ); switch ( choice ) { case 1: printf( "Enter an integer: " ); /* chiama push */ scanf( "%d", &value ); push( &stackptr, value ); printstack( stackptr ); break; case 2: if (!isempty( stackptr ) ) /* chiama pop */ printf( "The popped value is %d.\n", pop( &stackptr ) ); printstack( stackptr ); break; case 3: printf( "End of run.\n" ); break; default: printf( "Invalid choice.\n\n" ); break; while ( choice!= 3 ); return 0;
51 void instructions( void ) { printf( "Enter choice:\n"); printf( "1 to push a value on the stack\n"); printf( "2 to pop a value off the stack\n"); printf( "3 to end program\n\n> "); void push (StackNodePtr *topptr, int info) { StackNodePtr newptr; newptr = malloc( sizeof( StackNode ) ); if ( newptr!= NULL ) { newptr->data = info; newptr->nextptr = *topptr; *topptr = newptr; else printf( "%d not inserted. No memory available.\n", info );
52 int pop( StackNodePtr *topptr ) { StackNodePtr tempptr = *topptr; int popvalue = (*topptr)->data; *topptr = (*topptr)->nextptr; free( tempptr ); return popvalue; void printstack( StackNodePtr currentptr ) { if ( currentptr == NULL ) printf( "The stack is empty.\n\n" ); else { printf( "The stack is:\n" ); while ( currentptr!= NULL ) { printf( "%d --> ", currentptr->data ); currentptr = currentptr->nextptr; printf( "NULL\n\n" ); int isempty( StackNodePtr topptr ) { return topptr == NULL;
53 coda Come al check-in First-in, first-out (FIFO) I nodi sono rimossi dalla testa I nodi sono inseriti in coda = lista vincolata, solo inserimento in coda e rimozione del primo elemento Utile nella programmazione di sistema: code della stampante, pacchetti accodati nella rete, richieste di accesso a file condivisi gestione semplice di turni per l accesso a risorse condivise coda c1 c2 c3 c4 c5
54 Coda (queue) In una coda l accesso è ristretto all elemento inserito meno recentemente (FIFO) Le operazioni tipiche supportate dalla coda sono: accoda o enqueue o offer aggiunge un elemento in coda dequeue o poll o rimuovi preleva e cancella l elemento di testa getfront o peek preleva ma non cancella l elemento di testa
55 Dichiarazione di coda (di interi) typedef struct codanode { int Info; struct codanode *Prox; Node; typedef Node *Coda; Coda fila1; struct definisce i campi di ogni elemento typedef rinomina il tipo struct codanode come Node typedef definisce il nuovo tipo Coda come puntatore al tipo Node fila é perciò il puntatore alla coda
56 accoda (come per lista in coda) Coda Accoda (Coda fila, int Elem) { Node *punt; if (fila == NULL {punt = malloc (sizeof(node)); punt->info = Elem; punt->prox = NULL; return punt; else {fila->prox=accoda(fila->prox, Elem); return fila;/*il puntatore a fila*/ chiamata: fila1 = Accoda(fila1, Nuovo);
57 rimuovi e restituisci il valore int Rimuovi (Coda *fila) { Node *out; int value; out = fila; value = (*fila)->info; *fila = (*fila)->prox; free (out); return value; chiamata: Q = Rimuovi (&fila1);
58 In C void printqueue( QueueNodePtr ); int isempty( QueueNodePtr ); int dequeue( QueueNodePtr *, QueueNodePtr * ); void enqueue( QueueNodePtr *, QueueNodePtr *, int ); void instructions( void );
59 int main() { QueueNodePtr firstptr = NULL, lastptr = NULL; int choice, item; do { instructions(); scanf( "%d", &choice ); switch( choice ) { case 1: printf( "Enter an integer: " ); scanf( "\n%d", &item ); enqueue(&firstptr, &lastptr, item ); printqueue( firstptr ); break; case 2: if (!isempty( firstptr ) ) { item = dequeue( &firstptr, &lastptr ); printf( "%d has been dequeued.\n", item ); printqueue( firstptr ); break; case 3: printf( "End of run.\n" ); break; default: printf( "Invalid choice.\n\n" ); break; while ( choice!= 3 ); return 0;
60 void instructions( void ) { printf ( "Enter your choice:\n" printf ( " 1 to add an item to the queue\n" printf ( " 2 to remove an item from the queue\n" printf ( " 3 to end\n\n> " ); void enqueue( QueueNodePtr *firstptr, QueueNodePtr *lastptr, int value ) { QueueNodePtr newptr; newptr = malloc( sizeof( QueueNode ) ); if ( newptr!= NULL ) { newptr->data = value; newptr->nextptr = NULL; if ( isempty( *firstptr ) ) *firstptr = newptr; else ( *lastptr )->nextptr = newptr; *lastptr = newptr; else printf( "%c not inserted. No memory available.\n", value); 60
61 int dequeue( QueueNodePtr *firstptr, QueueNodePtr *lastptr ) { QueueNodePtr tempptr = *firstptr; int value = ( *firstptr )->data; *firstptr = ( *firstptr )->nextptr; if ( *firstptr == NULL ) *lastptr = NULL; free( tempptr ); return value; void printqueue( QueueNodePtr currentptr ) { if ( currentptr == NULL ) printf( "Queue is empty.\n\n" ); else { printf( "The queue is:\n" ); while ( currentptr!= NULL ) { printf( "%d --> ", currentptr->data ); currentptr = currentptr->nextptr; printf( "NULL\n\n" ); int isempty( QueueNodePtr firstptr ) { return fearstptr == NULL;
62 Insieme (o set) È come la lista, ma con il vincolo di non ammettere valori duplicati L ordine in cui appaiono gli elementi nella lista non è significativo Di solito, per motivi di convenienza, gli insiemi si realizzano tramite liste ordinate Così si velocizzano le operazioni di ricerca (dicotomica / binary search) e inserimento
63 Prototipi per l insieme int add ( Tipo item, Insieme * i ); aggiunge l elemento dato all insieme e restituisce un valore che indica se l operazione ha avuto successo int remove ( Tipo item, Insieme * i ); rimuove dall insieme l elemento indicato e restituisce un valore che indica se l operazione ha avuto successo int contains ( Tipo item, Insieme i ); verifica se l elemento dato è presente nell insieme
64 Rappresentazione di insiemi tramite array Per rappresentare insiemi di lettere? N = 26!! Sfruttiamo l'ordinamento delle lettere per metterle in corrispondenza con gli interi nell'array [A=0, B=1, Z=25] typedef int alfabeto[26]; o { emptyset = {0,0,0, 0 (26 zeri) {A solo a = {1,0,0, 0 (25 zeri) {A, Z alfabeto testacoda = {1,0 0,1 {A, C, F alfabeto acf = {1,0,1,0,0,1,0 0 (24 zeri)
65 insiemi tramite array operazioni base N.B. Gli insiemi sono intrinsecamente ordinati In virtù dell' associazione biunivoca tra indici ed elementi Siano dati i seguenti insiemi di lettere: S, T, U, I; Calcoliamo in U l'unione di S e T : i = 0; while( i < N ) { U[i] = S[i] T[i]; / assegna 0 o 1 / i = i + 1; Calcoliamo in I l'intersezione di S e T : i = 0; while( i < N ) { I[i] = S[i] && T[i]; / assegna 0 o 1 / i = i + 1;
66 Nested set nested set model tecnica per rappresentare gerarchie nei data base relazionali. Alternativi a alberi.
67 Esercizi Liste Da vecchi temi d esame
68 Esercizio 1 Due liste di interi si dicono equipotenti se sono di uguale lunghezza e, confrontando i valori in posizioni corrispondenti, risulta che i valori della prima lista maggiori dei corrispondenti valori nella seconda sono esattamente in numero uguale ai valori della seconda lista maggiori dei corrispondenti valori nella prima. Data la lista definita come: typedef struct EL { int valore; struct EL * next; Nodo; typedef Nodo * Lista; si descriva un algoritmo e si proponga una codifica per la funzione di prototipo int equipotenti ( Lista L1, Lista L2 ); che restituisce 1 se le liste sono equipotenti, 0 altrimenti.
69 soluzione1 int equipotenti ( Lista L1, Lista L2 ) { return controlla(l1, L2, 0); int controlla ( Lista L1, Lista L2, int bilancio ) { if ( L1 == NULL L2 == NULL ) return ( L1 == L2 && bilancio == 0 ); if ( L1->valore > L2->valore ) bilancio++; else if ( L1->valore < L2->valore ) bilancio--; return controlla( L1->next, > L2->next, bilancio );
70 Esercizio 2 Si consideri la seguente definizione: typedef struct Elem { char * parola; struct Elem * next; Nodo; typedef Nodo * Lista; Due parole si dicono simili se hanno al più due caratteri diversi. Una catena di parole si dice compatibile col telefono senza fili (cctsf) se ogni parola è simile alle adiacenti. La funzione int simili (char *s1, char *s2 ); restituisce 1 se s1 e s2 sono simili, 0 altrimenti. Usando la funzione simili( ) (senza codificarla), si codifichi in C una funzione f( ), preferibilmente ricorsiva, che riceve come parametro una lista dinamica di parole (secondo la definizione soprastante) e restituisce 1 se la lista rappresenta una catena cctsf, 0 altrimenti.
71 Soluzione 2 int f( Lista a ) { /* Versione ricorsiva */ if ( a == NULL a->next == NULL ) return 1; if (!simili(a->parola, a->next->parola) ) return 0; return f( a->next ); int f( Lista a ) { /* Versione iterativa */ while ( a!= NULL && a->next!= NULL ) { if (!simili(a->parola, a->next->parola) ) return 0; a = a->next; return 1; int f( Lista a ) { /* Versione "provocatoria" */ return ( a==null a->next==null simili(a->parola, a->next->parola) && f(a->next) );
72 Esercizio 2a Si consideri poi la definizione di una lista di catene di parole (da ogni NodoTesta inizia una Lista). typedef struct Elem2 { Lista catena; struct Elem2 * next; NodoTesta; typedef NodoTesta * ListaDiListe; Si codifichi (preferibilmente in modo ricorsivo: bonus +1) una funzione che riceve una lista di liste così definita e dealloca interamente dalla lista di liste le sequenze di parole che non sono cctsf. Attenzione: si ipotizzi che nelle catene non ci siano parole allocate staticamente, e si badi a deallocare tutta la memoria dinamica. [3 punti, +1 se in versione ricorsiva]
73 Soluzione 2a void deallocacatena( Lista a ) { if ( a!= NULL ) { deallocacatena( a->next ); free(a->parola); /* Bisogna deallocare anche il vettore dinamico */ free( a ); ListaDiListe sfrondalistadiliste( ListaDiListe b ) { if ( b!= NULL ) { ListaDiListe tmp = sfrondalistadiliste( b->next ); if (!f( b->catena ) ) { deallocacatena( b->catena ); free( b ); return tmp; else b->next = tmp; return b;
74 Esercizio 3 Si consideri la seguente definizione: typedef struct Elem { int x; int y; struct Elem * next; Punto; typedef Punto * Linea; Una linea spezzata è rappresentata da una lista di punti con coordinate intere. Definiamo una spezzata aperta non degenere (AND) se i suoi punti sono almeno due e tutti diversi tra loro. Consideriamo solo spezzate AND. La lunghezza di una spezzata è la somma delle distanze euclidee tra punti consecutivi. Date due spezzate A e B, diciamo che A e B sono disgiunte se non hanno punti in comune, che B è una scorciatoia di A se A e B hanno gli stessi estremi ma B ha lunghezza minore, che A contiene B se B è una sottosequenza di A, e che A estende B se A contiene B e hanno l'ultimo punto in comune, e infine definiamo la concatenazione di due liste disgiunte A e B come la linea C = A B ottenuta aggiungendo B in coda ad A. Se A e B non sono disgiunte, A B =.
75 Esercizio 3 - cont Si progettino e codifichino opportunamente le funzioni seguenti. int scorciatoia(linea A, Linea B) restituisce 1 se A è scorciatoia di B, 0 altrimenti int estende(linea A, Linea B) restituisce 1 se A estende B, 0 altrimenti Linea concatena(linea A, Linea B) restituisce C=A B riusando i nodi di A e B. float tortuosità(linea A) restituisce il rapporto tra la lunghezza di A e la distanza tra i suoi estremi È indispensabile definire, codificare e usare altre opportune funzioni di supporto per definire in modo più compatto e leggibile le funzioni richieste.
76 soluzione 3 int uguali( Punto a, Punto b ) { /* Punti uguali se coordinate uguali */ return ( (a.x == b.x) && (a.y == b.y) ); int numnodi( Linea A ) { /* Conteggio ricorsivo standard dei nodi */ if ( A == NULL ) return 0; return 1 + numnodi(a->next);
77 soluzione 3 - cont int AND( Linea A ) { Linea tmp; if ( numnodi(a) < 2 ) return 0; /* Se non è almeno un segmento, non è AND */ while( A!= NULL ) { /* Per ogni punto */ tmp = A->next; while(tmp!= NULL) { /*se ce n'è un altro uguale */ if ( uguali(*a, *tmp) ) return 0; tmp = tmp->next; A = A->next; return 1; /* Se arriviamo in fondo, è AND */
78 soluzione 3 - cont Definita la funzione AND(),ipotizziamo senza ledere la generalità che le linee passate come parametro alle altre funzioni siano AND, a cura dei rispettivi programmi chiamanti (che possono verificare i parametri prima di procedure all'invocazione). Ciò è coerente con l'indicazione della traccia "consideriamo solo spezzate AND". Punto * last( Linea A ) { /* Un puntatore all'ultimo punto */ if ( A == NULL A->next == NULL ) return A; return last(a->next);
79 soluzione 3 - cont float dist( Punto p, Punto q ) { return sqrt( (p.x-q.x)*(p.x-q.x)+(p.y-q.y)*(p.y-q.y) ); float lung( Linea A ) { if ( A == NULL A->next == NULL ) return 0.0; return dist(*a, *(A->next)) + lung(a->next); int lineeuguali( Linea a, Linea b ) { if ( a == NULL && b == NULL ) return 1; if ( a == NULL b == NULL ) return 0; return uguali(*a,*b)&&lineeuguali(a->next,b->next);
80 soluzione 3 - cont Passiamo quindi a definire le funzioni richieste: int scorciatoia( Linea A, Linea B ) { if ( uguali(*a, *B) && uguali(*last(a), *last(b)) ) return lung(a) < lung (B); return 0; int estende( Linea A, Linea B ) { /* N.B.: B è AND per ipotesi */ if ( A == NULL ) return 0; if ( uguali(*a, *B) ) return lineeuguali(a, B); return estende(a->next, B);
81 soluzione 3 - cont Linea concatena( Linea A, Linea B ) { (last(a))->next = B; return A; float tortuosità( Linea A ) { return lung(a) / dist(*a, *last(a));
82 Esercizio 4 La funzione ds( ) calcola la differenza simmetrica degli elementi di due liste ordinate in senso crescente e prive di duplicati, restituendola come una nuova lista (allocata allo scopo), anch'essa ordinata. La differenza simmetrica è costituita dagli elementi che appartengono a una delle due liste ma non all'altra lista (contiene cioè tutti gli elementi che non sono in comune alle due liste). Si usi questa definizione: typedef struct N { int valore; struct N * next; Nodo; typedef Nodo * Lista; Si codifichi la funzione in C. Si apprezza il ricorso ad eventuali funzioni ausiliarie.
83 Soluzione 4 Se entrambe le liste sono vuote, C è il risultato finale (C è una lista inizialmente vuota). Se una delle due liste è vuota: inserisci in coda a C una copia dell elemento corrente della lista non vuota; avanti ricorsivamente sulla lista vuota e la coda della lista non vuota. Se entrambe le liste sono non vuote (possiamo confrontare i valori): se i valori in testa alle due liste sono uguali, avanti ricorsivamente sul next di entrambe le liste, senza modificare C se i valori sono diversi, inserisci in coda a C una copia dell elemento con il valore minore; avanti ricorsivamente, avanzando sul next della sola lista che aveva il valore minore
84 Soluzione 4 - cont Lista inscoda( Lista L, int n) { if( L == NULL ) { L = (Lista) malloc(sizeof(nodo)); L->next = NULL; L->valore = n; else L->next = inscoda( L->next, n ); return L;
85 Soluzione 4 - cont Lista ds( Lista A, Lista B, Lista C ) { // Una versione "analitica" if( A == NULL && B == NULL ) return C; if( A == NULL ) { C = inscoda( C, B->valore ); return ds(a, B->next, C); if( B == NULL ) { C = inscoda( C, A->valore ); return ds(a->next, B, C); if( A->valore < B->valore ) { C = inscoda( C, A->valore ); return ds(a->next, B, C); if( A->valore > B->valore ) { C = inscoda( C, B->valore ); return ds(a, B->next, C); return ds(a->next, B->next, C);
86 Soluzione 4 - cont // Una versione equivalente ma meno prolissa Lista ds( Lista A, Lista B, Lista C ) { if( A == NULL && B == NULL ) return C; if( A == NULL ( B!= NULL && A->valore > B->valore ) ) { C = inscoda( C, B->valore ); return ds(a, B->next, C); if( B == NULL ( A!= NULL && A->valore < B->valore ) ) { C = inscoda( C, A->valore ); return ds(a->next, B, C); return ds(a->next, B->next, C);
87 Soluzione 4 - cont // Soluzione alternativa Lista creanodo( int val ) { Lista tmp = (Lista) malloc(sizeof(nodo)); tmp->next = NULL; tmp->valore = val; return tmp; Lista Copia( Lista L ) { // Alloca e restituisce una copia di L Lista tmp = L; if( tmp!= NULL ) tmp = creanodo( L->valore ); tmp->next = Copia( L->next ); return tmp;
88 Soluzione 4 - cont Lista ds( Lista A, Lista B ) { Lista tmp = NULL; if( A == NULL ) return Copia( B ); if( B == NULL ) return Copia( A ); if( A->valore < B->valore ) { tmp = creanodo( A->valore ); tmp->next = ds( A->next, B ); else if( A->valore > B->valore ) { tmp = creanodo( B->valore ); tmp->next = ds( A, B->next ); else tmp = ds( A-next, B->next ); return tmp; Si noti che non si effettua inserimento in coda e non si deve quindi scorrere più volte alcuna lista. Si noti che non è necessario propagare come parametro un riferimento alla lista in costruzione. Si noti anche come la scomposizione in funzioni aiuta a rendere la soluzione comprensibile. Si noti infine che le differenze simmetriche restituite dalle chiamate ricorsive alla funzione ds vengono agganciate "in coda" all'elemento di volta in volta costruito dalle singole attivazioni.
89 Soluzione 4 - cont //Soluzione ricorsiva Se entrambe le liste sono vuote, la differenza simmetrica (d.s.) è vuota. Se i due valori in testa sono uguali, tale valore non sarà nella d.s.: non si alloca memoria, ma si propaga il calcolo e se ne restituisce il risultato In ogni altro caso occorre allocare un nodo, e dunque lo si fa subito: Se B è vuota oppure il valore in testa a B è maggiore di quello in testa a A Il nuovo nodo riceve A->valore (che fa parte della d.s.) L'analisi continuerà su B e la coda di A altrimenti (cioè se A è vuota oppure il valore in testa a B è minore di quello in testa a A) Il nuovo nodo riceve B->valore (che fa parte della d.s.) L'analisi continuerà su A e la coda di B SI EFFETTUA LA CHIAMATA RICORSVA La lista restituita da tale chiamata viene attaccata in coda al nuovo elemento, che è il primo della d.s. Come nella seconda soluzione, il nuovo nodo viene allocato prima della chiamata ricorsiva, ma viene agganciato alla lista solo quando l'esecuzione della chiamata ricorsiva è terminata. In questo modo è possibile eseguire "in testa" l'inserimento che nella prima versione avviene "in coda", sfruttando la "fase discendente" della ricorsione quella cioè in cui si deallocano i record di attivazione.
90 Soluzione 4 - cont Lista ds( Lista A, Lista B ) { Lista tmp; if( A == NULL && B == NULL ) return NULL; if( B!= NULL && B!= NULL && A->valore == B->valore ) return ds(a->next, B->next); tmp = (Lista) malloc(sizeof(nodo)); if ( B == NULL (A!= NULL && A->valore < B->valore) ) { tmp->valore = A->valore; A = A->next; else { // qui è garantito che A == NULL B!= NULL && A->valore > B->valore tmp->valore = B->valore; B = B->next; tmp->next = ds(a, B); return tmp;
Strutture Dati Dinamiche. Monday, January 10, 2011
Strutture Dati Dinamiche 1 Che cos è una struttura dati Per struttura dati si intende comunemente la rappresentazione dei dati e le operazioni consentite su tali dati In linguaggi più evoluti del C esistono
DettagliStrutture Dati Dinamiche. Credits Prof Alessandro Campi
Strutture Dati Dinamiche Credits Prof Alessandro Campi 1 Che cos è una struttura dati Per struttura dati si intende comunemente la rappresentazione dei dati e le operazioni consentite su tali dati In linguaggi
DettagliStrutture dati dinamiche
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
DettagliStrutture 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));
DettagliStrutture Dinamiche. Strutture Dinamiche
Corso di Informatica A Vito Perrone 1 Indice Allocazione e de-allocazione di memoria Liste e loro gestione 2 Allocazione e cancellazione di memoria malloc (sizeof (TipoDato)); Crea in memoria una variabile
DettagliPolitecnico di Milano. Strutture dati dinamiche
Politecnico di Milano Strutture dati dinamiche Strutture dati statiche e dinamiche In C le dimensioni di ogni dato sono note prima dell esecuzione Sarebbe utile avere contenitori la cui dimensione varia
DettagliSTRUTTURE. Sommario Introduzione Definizione di strutture Inizializzazione di strutture
STRUTTURE Sommario Introduzione Definizione di strutture Inizializzazione di strutture Accesso ai membri di una struttura Uso delle strutture con le funzioni Typedef Strutture ricorsive Allocazione dinamica
DettagliADT STACK (PILA) ADT STACK (PILA)
ADT STACK (PILA) Collezione di elementi dello stesso tipo (multi-insieme) gestito con politica LIFO (Last-In -- First-Out): il primo elemento entrato è l ultimo a uscire Svariate applicazioni del concetto
DettagliSTRUTTURE Prentice Hall, Inc. All rights reserved.
STRUTTURE Sommario Introduzione Definizione di strutture Inizializzazione di strutture Accesso ai membri di una struttura Uso delle strutture con le funzioni Typedef INTRODUZIONE L'array è un esempio di
DettagliStrutture dati dinamiche in C. Emilio Di Giacomo
Strutture dati dinamiche in C Emilio Di Giacomo Strutture dati Una struttura dati è un contenitore in cui i dati sono organizzati in maniera che possano essere recuperati e manipolati efficientemente Un
DettagliADT STACK (PILA) Svariate applicazioni del concetto di stack:
ADT STACK (PILA) Collezione di elementi dello stesso tipo (multi-insieme) gestito con politica LIFO (Last-In -- First-Out): il primo elemento entrato è l ultimo a uscire Svariate applicazioni del concetto
DettagliListe concatenate. Violetta Lonati
Liste concatenate Violetta Lonati Università degli studi di Milano Dipartimento di Informatica Laboratorio di algoritmi e strutture dati Corso di laurea in Informatica 2 novembre 2017 Violetta Lonati Liste
DettagliEsercizi Liste. Prof. Alessandro Campi
Esercizi Liste Prof. Alessandro Campi Esercizio Si consideri una lista dinamica di interi, i cui elementi sono del tipo definito come di seguito riportato: typedef struct El { int dato; struct El *next;
DettagliLa struttura dati CODA
Programmazione M-Z Ingegneria e Scienze Informatiche - Cesena A.A. 2016-2017 La struttura dati CODA Pietro Di Lena - pietro.dilena@unibo.it Introduzione Una coda (o queue) è una struttura dati astratta
DettagliIL CONCETTO DI LISTA!
Liste semplici Obiettivi: Discutere la realizzazione collegata (puntatori a strutture) di liste semplici Introdurre l ADT lista semplice e le operazioni tipiche su essa 1 IL CONCETTO DI LISTA Una lista
DettagliADT STACK (PILA) ADT STACK (PILA) IL COMPONENTE STACK (PILA) CONSIDERAZIONI. Per utilizzare istanze del tipo di dato astratto
ADT STACK (PILA) Collezione di elementi dello stesso tipo (multi-insieme) gestito con politica LIFO (Last-In -- First-Out): t) il primo elemento entrato è l ultimo a uscire Svariate applicazioni del concetto
DettagliEsercitazione 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
DettagliE12 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
DettagliPILE 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):
DettagliLinguaggio 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
DettagliAllocazione dinamica memoria
Allocazione dinamica memoria Marco Casazza 11/12/2017 1 Esercizio 1 1 /* 2 Creare una lista bidirezionale di interi, ovvero una lista 3 che permette lo scorrimento in entrambe le direzioni ( dal primo
DettagliEsercitazioni di Fondamenti di Informatica - Lez. 8 27/11/2018
Esercitazioni di Fondamenti di Informatica - Lez. 8 27/11/2018 Esercizi sull allocazione dinamica della memoria in C Il codice di questi esercizi é contenuto nella cartella parte1 1. Implementare una lista
DettagliEsercitazioni di Fondamenti di Informatica - Lez. 7 20/11/2018
Esercitazioni di Fondamenti di Informatica - Lez. 7 0/11/018 Esercizi sull allocazione dinamica della memoria in C 1. Cosa stampa il seguente programma? 1 #d e f i n e MAXLENGTH 0 4 typedef struct { char
DettagliDiversi modi di rappresentare sequenze di elementi
Liste È molto comune dover rappresentare sequenze di elementi tutti dello stesso tipo e fare operazioni su di esse. Esempi: sequenza di interi (23 46 5 2 3) sequenza di caratteri ( x r f ) sequenza di
DettagliLaboratorio di Programmazione
Laboratorio di Programmazione (Laurea triennale in matematica) Lezione 25 Le liste in C struct nodo { int info; struct nodo *next; }; typedef struct nodo Nodo; typedef Nodo *PNodo; Inserimento in ordine
Dettagli10/10/2016. Caratteristiche degli array. Il tipo RECORD. Il record. LABORATORIO DI PROGRAMMAZIONE 2 Corso di laurea in matematica
Caratteristiche degli array Principali caratteristiche degli array: LABORATORIO DI PROGRAMMAZIONE 2 Corso di laurea in matematica Marco Lapegna Dipartimento di Matematica e Applicazioni Universita degli
DettagliIl 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;
DettagliADT STACK (PILA) Svariate applicazioni del concetto di stack:
Stack e Code Obiettivi: Introdurre l ADT Stack e l ADT Coda e le operazioni tipiche su esse Discuterne la realizzazione sequenziale (mediante vettori) e la realizzazione collegata (puntatori a strutture)
DettagliFondamenti di Informatica e Laboratorio T-AB T-15 Strutture dati
Fondamenti di Informatica e Laboratorio T-AB T-15 Strutture dati Paolo Torroni Dipartimento di Elettronica, Informatica e Sistemistica Università degli Studi di Bologna Anno Accademico 2008/2009 Sommario
DettagliRappresentazione di sequenze...
Liste Rappresentazione di sequenze... Ritorniamo al nostro problema di rappresentare le sequenze, se vi ricordate avevano sottolineato un paio di problemi della rappresentazione di sequenze usando array
DettagliListe 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
DettagliProgrammazione II canale AD -- Esonero del 21/04/2006
Esercizio 1 (Sbarramento ) Si scriva una funzione ricorsiva che riceve in input una lista concatenata di interi L e restituisce una nuova lista concatenata di interi L1 in cui l elemento j-simo ( j 1)
DettagliLa definizione del tipo di dato astratto lista è intrinsecamente ricorsiva, infatti una lista può essere:
LISTE DINAMICHE Liste semplicemente concatenate: La definizione del tipo di dato astratto lista è intrinsecamente ricorsiva, infatti una lista può essere: la lista vuota; oppure contiene un valore (di
Dettaglia.a Codice corso: 21012, La definizione del tipo di dato astratto lista è intrinsecamente ricorsiva, infatti una lista può essere:
LISTE DINAMICHE Liste semplicemente concatenate: La definizione del tipo di dato astratto lista è intrinsecamente ricorsiva, infatti una lista può essere: la lista vuota; oppure contiene un valore (di
DettagliLaboratorio di Programmazione
Laboratorio di Programmazione (Laurea triennale in matematica) Lezione 33 Le liste in C struct nodo { int info; struct nodo *next; }; typedef struct nodo Nodo; typedef Nodo *PNodo; Pila (Stack ) La struttura
DettagliListe collegate. Liste
Liste È molto comune dover rappresentare sequenze di elementi tutti dello stesso tipo e fare operazioni su di esse. Esempi: sequenza di interi (23 46 5 28 3) sequenza di caratteri ( x r f ) sequenza di
DettagliIntroduzione. Liste. Strutture ricorsive (2) Strutture ricorsive (1) DD p KP p
Introduzione Liste DD p. 449-474 KP p.397-424 Abbiamo fin ora studiato strutture dati con dimensione fissa: vettori e matrici strutture Introduciamo ora le strutture dati dinamiche (liste concatenate):
DettagliGestione dinamica della memoria
Programmazione M-Z Ingegneria e Scienze Informatiche - Cesena A.A. 2016-2017 Gestione dinamica della memoria Pietro Di Lena - pietro.dilena@unibo.it A pessimistic programmer sees the array as half empty.
DettagliIn questa lezione Strutture dati elementari: Pila Coda Loro uso nella costruzione di algoritmi.
In questa lezione Strutture dati elementari: Pila Coda Loro uso nella costruzione di algoritmi. 1 strutture dati (astratte) Una struttura dati astratti consiste di uno o più insiemi con delle operazioni
DettagliLaboratorio 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
DettagliAllocazione dinamica della memoria
Allocazione dinamica della memoria Violetta Lonati Università degli studi di Milano Dipartimento di Informatica Laboratorio di algoritmi e strutture dati Corso di laurea in Informatica Violetta Lonati
DettagliVariabili dinamiche. Obiettivi: Presentare le variabili dinamiche, allocate e deallocate nell area HEAP, e le funzioni malloc e free
Variabili dinamiche Obiettivi: Presentare le variabili dinamiche, allocate e deallocate nell area HEAP, e le funzioni malloc e free 1 Tipi di variabili in C In C è possibile classificare le variabili in
DettagliAllocazione dinamica della memoria
Allocazione dinamica della memoria Allocazione statica: limiti Per quanto sappiamo finora, in C le variabili sono sempre dichiarate staticamente la loro esistenza deve essere prevista e dichiarata a priori
DettagliIMPLEMENTAZIONE CONCATENATE DELLE LISTE
IMPLEMENTAZIONE CONCATENATE DELLE LISTE Liste collegate Come già visto, la realizzazione sequenziale prevede che la sequenzialità degli elementi della lista venga rappresentata dalla adiacenza delle locazioni
DettagliPreviously on TDP. LISTA rappresentata mediante "struct e puntatori" Cosa e aux? Di che tipo e e cosa contiene?
Previously on TDP lis ^ ^ 7 21 ** ** 14 *** memoria 9 NULL LISTA rappresentata mediante "struct e puntatori" *** lis->info == cosa? lis->next == ^^; /*cosa e ^^?*/ che cosa e' (*lis)? Cosa e aux? Di che
DettagliPreviously on TDP. LISTA rappresentata mediante "struct e puntatori" TipoLista lis. Dichiarare DISEGNARE e. DISEGNARE aux.
Previously on TDP lis 7 21 ** ** 14 *** *** memoria 9 LISTA rappresentata mediante "struct e puntatori" TipoLista lis lis->info == cosa? lis->next == ; /*cosa e?*/ che cosa e' (*lis)? Dichiarare DISEGNARE
DettagliStrutture Dati Dinamiche
Strutture Dati Dinamiche Motivazioni Le variabili considerate fino a questo punto devono essere dichiarate staticamente, ossia la loro esistenza, il loro nome e la loro dimensione devono essere previsti
DettagliEsercitazione: Implementazione in linguaggio C dell ADT. Stack con l utilizzo. di linked list
Esercitazione: Implementazione in linguaggio C dell ADT Stack con l utilizzo di linked list Laboratorio di Programmazione Introduzione un ADT (Abstract Data Type) è un modello (formale) che generalizza
DettagliFondamenti di Informatica II
Università degli studi di Messina Facoltà di Ingegneria Corso di Laurea in Ingegneria Informatica e delle Telecomunicazioni Fondamenti di Informatica II Tipi di dati astratti(adt)- seconda parte Coda Struttura
DettagliAlgoritmi e Strutture di Dati
Algoritmi e Strutture di Dati Capitolo 4 - Strutture di dati elementari This work is licensed under the Creative Commons Attribution-NonCommercial-ShareAlike License. To view a copy of this license, visit
DettagliSOMMARIO STACK. STACK: specifica STACK
SOMMARIO STACK Pila (stack): una struttura dati lineare a cui si può accedere soltanto mediante uno dei suoi capi per memorizzare e per estrarre dati. Specifica (descrizione). Implementazione (realizzazione).
DettagliProgrammazione 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
DettagliAlgoritmi e Strutture Dati
Maria Rita Di Berardini, Emanuela Merelli 1 1 Dipartimento di Matematica e Informatica Università di Camerino A.A. 2006/07 Il concetto di dato Il concetto di tipo di dato Insertion Sort for j 2 to lenght[a]
DettagliAllocazione Dinamica della memoria
Allocazione dinamica Allocazione Dinamica della memoria I Il C mette a disposizione delle primitive per la gestione dinamica della memoria, grazie all utilizzo di alcune funzioni messe a disposizione dalla
DettagliLa Struttura Dati Pila
La Struttura Dati Pila La pila o stack è una particolare struttura dati in cui l'inserimento e la cancellazione sono consentite solo in una specifica posizione, chiamata cima (top) dello stack. La gestione
DettagliAlgoritmi e Strutture Dati
Maria Rita Di Berardini 2, Emanuela Merelli 1 1 Dipartimento di Matematica e Informatica Università di Camerino 2 Polo di Scienze Università di Camerino ad Ascoli Piceno Il concetto di dato Il concetto
DettagliAlgoritmi e Strutture Dati
Strutture Elementari Maria Rita Di Berardini, Emanuela Merelli 1 1 Dipartimento di Matematica e Informatica Università di Camerino 29 ottobre 2008 Strutture Dati Astratte Il concetto di dato Il concetto
DettagliCorso di Laurea Ingegneria Informatica Fondamenti di Informatica 2
Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2 Dispensa 09 ADT: Lista, Pila, Coda A. Miola Marzo 2007 http://www.dia.uniroma3.it/~java/fondinf2/ ADT: Lista, Pila, Coda 1 Contenuti Tipo
DettagliIn una coda gli inserimenti si fanno alla fine e le cancellazioni all inizio! First In First Out
In una coda gli inserimenti si fanno alla e e le cancellazioni all inizio! First In First Out Progr II - Coda 1 CODA: i requisiti Una coda (queue) è un ADT in cui le operazioni sono inserimenti e cancellazioni
DettagliALGORITMI E STRUTTURE DATI
ALGORITMI E STRUTTURE DATI Esercitazioni AndreA Orlandini http://www.dia.uniroma3.it/~orlandin/asd/ e-mail: orlandin@dia.uniroma3.it Orario di ricevimento: Martedì 14.00-16.00 Puntatori e Liste StudentiDIA
DettagliLa programmazione nel linguaggio C. Liste
Liste È molto comune dover rappresentare sequenze di elementi tutti dello stesso tipo e fare operazioni su di esse. Esempi: sequenza di interi (23 46 5 28 3) sequenza di caratteri ( x r f ) sequenza di
DettagliProgrammare. Compilatori e interpreti. Editor :: vi. Hello1.c. #include <stdio.h> >> cc Hello1.c. main() { printf( \n Hello World!
Programmare Hello1.c #include printf( \n Hello World! \n ); >> cc Hello1.c >> a.out Hello World! >> Hello1.c = file sorgente per scriverlo occorre un editor cc = compilatore per altri linguaggi
DettagliFondamenti di Informatica T. Linguaggio C: i puntatori
Linguaggio C: i puntatori Il puntatore E` un tipo di dato, che consente di rappresentare gli indirizzi delle variabili allocate in memoria. Dominio: Il dominio di una variabile di tipo puntatore è un insieme
DettagliTitolo presentazione INFORMATICA. sottotitolo A.A Milano, XX mese 20XX Laboratorio n 6 Ing. Gian Enrico Conti Dott.
Titolo presentazione INFORMATICA A sottotitolo A.A. 2017-18 Milano, XX mese 20XX Laboratorio n 6 Ing. Gian Enrico Conti Dott. Michele Zanella Info Logistiche (cont d) Calendario laboratori Data Orario
DettagliOgni variabile in C è una astrazione di una cella di memoria a cui corrisponde un nome, un contenuto e un indirizzo.
Ogni variabile in C è una astrazione di una cella di memoria a cui corrisponde un nome, un contenuto e un indirizzo. int a = 5; a 5 α=&a Esistono in C particolari variabili dette puntatori che possono
DettagliInsiemi Dinamici. Operazioni tipiche (S:struttura, x: riferimento(puntatore) alla chiave, k: chiave)
Insiemi Dinamici Insiemi che possono essere modificati Elementi: oggetti = eventualmente: chiavi + (eventuali) dati satellite; l insieme delle chiavi puo essere totalmente ordinato Operazioni tipiche (S:struttura,
DettagliProf. E. Occhiuto INFORMATICA 242AA a.a. 2010/11 pag. 1
Operazioni sulle liste Definiamo una serie di procedure e funzioni per operare sulle liste. Usiamo liste di interi per semplicità, ma tutte le operazioni sono realizzabili in modo del tutto analogo su
DettagliStrutture dati. Le liste
Strutture dati Le liste Introduzione Una lista è una successione finita di valori di un tipo (insieme di valori e ordine). Come tipo di dato è qualificata dalle operazioni che ci si possono svolgere: inserimento
DettagliEsercizi su strutture dati
Esercizi su strutture dati Marco Alberti Programmazione e Laboratorio, A.A. 2016-2017 Dipartimento di Matematica e Informatica - Università di Ferrara Ultima modifica: 21 dicembre 2016 Liste collegate
DettagliGestione della memoria
Gestione della memoria Stefano Ferrari Università degli Studi di Milano stefano.ferrari@unimi.it Programmazione anno accademico 2017 2018 Allocazione di memoria A una variabile puntatore si può assegnare
DettagliIntroduzione al linguaggio C Puntatori
Introduzione al linguaggio C Puntatori Violetta Lonati Università degli studi di Milano Dipartimento di Informatica Laboratorio di algoritmi e strutture dati Corso di laurea in Informatica 19 ottobre 2017
DettagliEsercizi 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
DettagliPROGRAMMAZIONE II canale A-D luglio 2008 TRACCIA DI SOLUZIONE
PROGRAMMAZIONE II canale A-D 2007-2008 14 luglio 2008 TRACCIA DI SOLUZIONE 1. Si vogliono realizzare mediante puntatori delle liste circolari, cioè delle liste tali che l ultimo elemento della lista punta
Dettaglitipi di dato astratti
tipi di dato astratti A. FERRARI ADT Un tipo di dato astratto o ADT (Abstract Data Type) è un tipo di dato le cui istanze possono essere manipolate con modalità che dipendono esclusivamente dalla semantica
Dettagli4 Le liste collegate 4.0. Le liste collegate. 4 Le liste collegate Rappresentazione di liste 4.1 Rappresentazione di liste
4 Le liste collegate 4.0 Le liste collegate c Diego Calvanese Fondamenti di Informatica Corso di Laurea in Ingegneria Elettronica A.A. 2001/2002 4.0 0 4 Le liste collegate Rappresentazione di liste 4.1
DettagliSommario. Le strutture dati elementari per implementare sequenze: Vettori Liste
Sequenze Sommario Le strutture dati elementari per implementare sequenze: Vettori Liste Strutture dati elementari Le strutture dati vettore e lista sono fra le strutture dati più usate e semplici Il loro
DettagliADT LISTA: altre operazioni non primitive ADT LISTA COSTRUZIONE ADT LISTA COSTRUZIONE ADT LISTA (2)
ADT LISTA Pochi Linguaggi forniscono tipo lista fra predefiniti (LISP, Prolog); per gli altri, ADT lista si costruisce a partire da altre strutture dati (in C tipicamente vettori o puntatori) OPERAZIONI
DettagliIl vettore e la lista concatenate (o catena) sono due esempi di strutture interne.
Strutture dati PILA e CODA Le strutture dati si dividono in interne e astratte. Quelle astratte sono rappresentazioni dei dati di un problema che rispecchiano le proprietà dei dati e le relazioni usate
DettagliINFORMATICA A. Titolo presentazione sottotitolo. Laboratorio n 6 Dott. Michele Zanella Ing. Gian Enrico Conti
INFORMATICA A Titolo presentazione sottotitolo A.A. 2018-19 Milano, XX mese 20XX Laboratorio n 6 Dott. Michele Zanella Ing. Gian Enrico Conti Ricorsione La ricorsione è un approccio per la risoluzione
Dettagli5. 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
DettagliFondamenti di Informatica
Strutture dati complesse Esempi di strutture dati complesse analizzate in questa lezione: Fondamenti di Informatica 21. Strutture di dati complesse in C++ Array di puntatori Pila (Stack) Coda (queue) Liste
DettagliUso avanzato dei puntatori Allocazione dinamica della memoria
Uso avanzato dei puntatori Allocazione dinamica della memoria Violetta Lonati Università degli studi di Milano Dipartimento di Informatica Laboratorio di algoritmi e strutture dati Corso di laurea in Informatica
DettagliListe con sentinella. intlist *createlist(void){ intlist *q = malloc(sizeof(intlist)); if(!q) { exit(-1); } q->next = q->prev = q; return q; }
Liste con sentinella Un ulteriore semplificazione delle operazioni sulle liste si ottiene utilizzando un elemento sentinella (dummy) che non contiene informazione, ma serve a segnalare la fine e l inizio
DettagliIl linguaggio C Strutture
Il linguaggio C Strutture Moreno Marzolla Dipartimento di Informatica Scienza e Ingegneria (DISI) Università di Bologna http://www.moreno.marzolla.name/ Copyright Mirko Viroli Copyright 2017, 2018 Moreno
Dettaglidott. Sabrina Senatore
dott. Sabrina Senatore Dipartimento di Informatica Riepilogo strutture 1 Sintassi della dichiarazione: typedef struct nome_tipo { Dichiarazione dei campi nome_tipo; typedef struct point{ int x; int y;
DettagliIl linguaggio C. Notate che...
Il linguaggio C Notate che... 1 Il C è un linguaggio a blocchi int main (void) { blocco } 2 Il C è un linguaggio a blocchi (2) Non è possibile mischiare dichiarazioni e comandi! int main (void) { } Dichiarazione
DettagliQuesta 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
DettagliLezione 23 - ADT LISTA
Lezione 23 - ADT LISTA Rappresentazione concreta del Tipo di Dati Astratto LISTA. - Cenni sulla rappresentazione mediante array (puah!) - Rappresentazione concreta mediante struct e puntatori. - concetto
DettagliLABORATORIO DI PROGRAMMAZIONE 2 Corso di laurea in matematica. Algoritmi ricorsivi
LABORATORIO DI PROGRAMMAZIONE 2 Corso di laurea in matematica Marco Lapegna Dipartimento di Matematica e Applicazioni Universita degli Studi di Napoli Federico II wpage.unina.it/lapegna Partiamo da un
DettagliLa programmazione nel linguaggio C
Cancellazione : versione ricorsiva Sfruttiamo la visione ricorsiva della struttura dati per realizzare la cancellazione in modo ricorsivo 1. la cancellazione della vuota non richiede alcuna azione 2. la
DettagliNella scorsa lezione: Array multidimensionali. Mappa di memorizzazione. Esempio: ordinamento di parole. Argomenti di main.
Nella scorsa lezione: Array multidimensionali. Mappa di memorizzazione. Esempio: ordinamento di parole. Argomenti di main. Puntatori a funzioni. Array di puntatori a funzioni. Esempio: ordinamento di parole
DettagliProva di Algoritmi e s.d. (1o anno) 17 Settembre TESTO e RISPOSTE
Prova di Algoritmi e s.d. (1o anno) 17 Settembre 2002 TESTO e RISPOSTE Esercizio 1 (punti 7 in prima approssimazione) Consideriamo alberi binari con insieme dei nodi NODI = N (l'insieme dei naturali).
DettagliINFORMATICA 2010/11 - CdL in FISICA TERZO APPELLO 8/09/2011: SOLUZIONI PROPOSTE
INFORMATICA 2010/11 - CdL in FISICA TERZO APPELLO 8/09/2011: SOLUZIONI PROPOSTE Scrivere in stampatello COGNOME, NOME e MATRICOLA su ogni foglio consegnato N.B.: In tutti gli esercizi viene valutata anche
DettagliLaboratorio di Programmazione
Laboratorio di Programmazione (Laurea triennale in matematica) Lezione 25 ADT (Abstract Data Types) tipo di dato astratto Un ADT è un modello matematico con una collezione di operatori definiti su tale
DettagliStrutture dati. Il che cosa e il come. F. Damiani - Alg. & Lab. 04/05
Strutture dati Il che cosa e il come Il che cosa ed il come Struttura dati: descrive come sono organizzati i dati e come sono realizzate le operazioni su di essi (cioe come si accede ai dati) Specifica
DettagliUnità Didattica 4 Linguaggio C. Vettori. Puntatori. Funzioni: passaggio di parametri per indirizzo.
Unità Didattica 4 Linguaggio C Vettori. Puntatori. Funzioni: passaggio di parametri per indirizzo. 1 Vettori Struttura astratta: Insieme di elementi dello stesso tipo, ciascuno individuato da un indice;
DettagliLa 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
Dettagli