Dipartimento di Elettronica, Informazione e Bioingegneria API 2013/4

Dimensione: px
Iniziare la visualizzazioe della pagina:

Download "Dipartimento di Elettronica, Informazione e Bioingegneria API 2013/4"

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. 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

Dettagli

Strutture Dati Dinamiche. Credits Prof Alessandro Campi

Strutture 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

Dettagli

Strutture dati dinamiche

Strutture 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

Dettagli

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));

Dettagli

Strutture Dinamiche. Strutture Dinamiche

Strutture 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

Dettagli

Politecnico di Milano. Strutture dati dinamiche

Politecnico 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

Dettagli

STRUTTURE. Sommario Introduzione Definizione di strutture Inizializzazione di strutture

STRUTTURE. 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

Dettagli

ADT STACK (PILA) ADT STACK (PILA)

ADT 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

Dettagli

STRUTTURE Prentice Hall, Inc. All rights reserved.

STRUTTURE 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

Dettagli

Strutture dati dinamiche in C. Emilio Di Giacomo

Strutture 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

Dettagli

ADT STACK (PILA) Svariate applicazioni del concetto di stack:

ADT 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

Dettagli

Liste concatenate. Violetta Lonati

Liste 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

Dettagli

Esercizi Liste. Prof. Alessandro Campi

Esercizi 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;

Dettagli

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 - pietro.dilena@unibo.it Introduzione Una coda (o queue) è una struttura dati astratta

Dettagli

IL CONCETTO DI LISTA!

IL 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

Dettagli

ADT STACK (PILA) ADT STACK (PILA) IL COMPONENTE STACK (PILA) CONSIDERAZIONI. Per utilizzare istanze del tipo di dato astratto

ADT 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

Dettagli

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

Dettagli

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

Dettagli

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):

Dettagli

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

Dettagli

Allocazione dinamica memoria

Allocazione 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

Dettagli

Esercitazioni di Fondamenti di Informatica - Lez. 8 27/11/2018

Esercitazioni 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

Dettagli

Esercitazioni di Fondamenti di Informatica - Lez. 7 20/11/2018

Esercitazioni 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

Dettagli

Diversi modi di rappresentare sequenze di elementi

Diversi 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

Dettagli

Laboratorio di Programmazione

Laboratorio 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

Dettagli

10/10/2016. Caratteristiche degli array. Il tipo RECORD. Il record. LABORATORIO DI PROGRAMMAZIONE 2 Corso di laurea in matematica

10/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

Dettagli

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;

Dettagli

ADT STACK (PILA) Svariate applicazioni del concetto di stack:

ADT 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)

Dettagli

Fondamenti di Informatica e Laboratorio T-AB T-15 Strutture dati

Fondamenti 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

Dettagli

Rappresentazione di sequenze...

Rappresentazione 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

Dettagli

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

Dettagli

Programmazione II canale AD -- Esonero del 21/04/2006

Programmazione 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)

Dettagli

La definizione del tipo di dato astratto lista è intrinsecamente ricorsiva, infatti una lista può essere:

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

Dettagli

a.a Codice corso: 21012, La definizione del tipo di dato astratto lista è intrinsecamente ricorsiva, infatti una lista può essere:

a.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

Dettagli

Laboratorio di Programmazione

Laboratorio 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

Dettagli

Liste collegate. Liste

Liste 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

Dettagli

Introduzione. Liste. Strutture ricorsive (2) Strutture ricorsive (1) DD p KP p

Introduzione. 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):

Dettagli

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 - pietro.dilena@unibo.it A pessimistic programmer sees the array as half empty.

Dettagli

In 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. 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

Dettagli

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

Dettagli

Allocazione dinamica della memoria

Allocazione 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

Dettagli

Variabili 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 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

Dettagli

Allocazione dinamica della memoria

Allocazione 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

Dettagli

IMPLEMENTAZIONE CONCATENATE DELLE LISTE

IMPLEMENTAZIONE 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

Dettagli

Previously on TDP. LISTA rappresentata mediante "struct e puntatori" Cosa e aux? Di che tipo e e cosa contiene?

Previously 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

Dettagli

Previously on TDP. LISTA rappresentata mediante "struct e puntatori" TipoLista lis. Dichiarare DISEGNARE e. DISEGNARE aux.

Previously 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

Dettagli

Strutture Dati Dinamiche

Strutture 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

Dettagli

Esercitazione: 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 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

Dettagli

Fondamenti di Informatica II

Fondamenti 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

Dettagli

Algoritmi e Strutture di Dati

Algoritmi 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

Dettagli

SOMMARIO STACK. STACK: specifica STACK

SOMMARIO 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).

Dettagli

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

Dettagli

Algoritmi e Strutture Dati

Algoritmi 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]

Dettagli

Allocazione Dinamica della memoria

Allocazione 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

Dettagli

La Struttura Dati Pila

La 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

Dettagli

Algoritmi e Strutture Dati

Algoritmi 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

Dettagli

Algoritmi e Strutture Dati

Algoritmi 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

Dettagli

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2

Corso 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

Dettagli

In 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 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

Dettagli

ALGORITMI E STRUTTURE DATI

ALGORITMI 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

Dettagli

La programmazione nel linguaggio C. Liste

La 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

Dettagli

Programmare. Compilatori e interpreti. Editor :: vi. Hello1.c. #include <stdio.h> >> cc Hello1.c. main() { printf( \n Hello World!

Programmare. 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

Dettagli

Fondamenti di Informatica T. Linguaggio C: i puntatori

Fondamenti 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

Dettagli

Titolo presentazione INFORMATICA. sottotitolo A.A Milano, XX mese 20XX Laboratorio n 6 Ing. Gian Enrico Conti Dott.

Titolo 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

Dettagli

Ogni 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. 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

Dettagli

Insiemi Dinamici. Operazioni tipiche (S:struttura, x: riferimento(puntatore) alla chiave, k: chiave)

Insiemi 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,

Dettagli

Prof. E. Occhiuto INFORMATICA 242AA a.a. 2010/11 pag. 1

Prof. 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

Dettagli

Strutture dati. Le liste

Strutture 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

Dettagli

Esercizi su strutture dati

Esercizi 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

Dettagli

Gestione della memoria

Gestione 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

Dettagli

Introduzione al linguaggio C Puntatori

Introduzione 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

Dettagli

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

Dettagli

PROGRAMMAZIONE II canale A-D luglio 2008 TRACCIA DI SOLUZIONE

PROGRAMMAZIONE 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

Dettagli

tipi di dato astratti

tipi 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

Dettagli

4 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. 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

Dettagli

Sommario. Le strutture dati elementari per implementare sequenze: Vettori Liste

Sommario. 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

Dettagli

ADT LISTA: altre operazioni non primitive ADT LISTA COSTRUZIONE ADT LISTA COSTRUZIONE ADT LISTA (2)

ADT 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

Dettagli

Il vettore e la lista concatenate (o catena) sono due esempi di strutture interne.

Il 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

Dettagli

INFORMATICA A. Titolo presentazione sottotitolo. Laboratorio n 6 Dott. Michele Zanella Ing. Gian Enrico Conti

INFORMATICA 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

Dettagli

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

Dettagli

Fondamenti di Informatica

Fondamenti 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

Dettagli

Uso avanzato dei puntatori Allocazione dinamica della memoria

Uso 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

Dettagli

Liste con sentinella. intlist *createlist(void){ intlist *q = malloc(sizeof(intlist)); if(!q) { exit(-1); } q->next = q->prev = q; return q; }

Liste 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

Dettagli

Il linguaggio C Strutture

Il 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

Dettagli

dott. Sabrina Senatore

dott. 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;

Dettagli

Il linguaggio C. Notate che...

Il 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

Dettagli

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

Dettagli

Lezione 23 - ADT LISTA

Lezione 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

Dettagli

LABORATORIO DI PROGRAMMAZIONE 2 Corso di laurea in matematica. Algoritmi ricorsivi

LABORATORIO 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

Dettagli

La programmazione nel linguaggio C

La 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

Dettagli

Nella 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. 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

Dettagli

Prova di Algoritmi e s.d. (1o anno) 17 Settembre TESTO e RISPOSTE

Prova 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).

Dettagli

INFORMATICA 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 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

Dettagli

Laboratorio di Programmazione

Laboratorio 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

Dettagli

Strutture dati. Il che cosa e il come. F. Damiani - Alg. & Lab. 04/05

Strutture 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

Dettagli

Unità 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. 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;

Dettagli

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

Dettagli