Gestione dinamica di una lista
|
|
- Francesco Di Gregorio
- 4 anni fa
- Visualizzazioni
Transcript
1 Gestione dinamica di una lista La lista lineare è una struttura astratta di dati a lunghezza variabile in cui l'inserimento di un nuovo elemento e l'estrazione di un elemento può essere effettuata in una qualsiasi posizione : in testa, in coda, intermedia.. Ogni elemento della lista (nodo) è costituito da due campi : un campo (inf) contenente l informazione (dato) e un campo (psucc) contenente il puntatore (indirizzo) dell elemento successivo. Ogni nodo è accessibile mediante il suo puntatore (p) : I due campi sono, convenzionalmente, indicati e distinti da : p -> inf per il campo informazione e da p -> psucc per il campo contenente il puntatore all elemento successivo. Una lista lineare modo : può essere, quindi, graficamente rappresentata nel seguente dove : è l ultimo nodo della lista è un qualsiasi nodo intermedio è il primo nodo della lista e dove : inf1,inf2,inf3,.infn rappresentano il campo informazione del nodo; p1, p2,p3, rappresentano il puntatore al nodo successivo; null è un valore simbolico del puntatore che individua la fine della lista; TDL è un puntatore esterno che individua il primo elemento della lista. Gestione dinamica di una lista a cura del Prof. Salvatore DE GIORGI pag. 1
2 Operazioni con la lista Operazione di Inserimento in testa Data la lista : per effettuare un inserimento in testa si devono effettuare i seguenti passi : 1) creare un nuovo nodo : dove : pnuovo è il nuovo puntatore assegnato al nodo. 2) assegnare opportunamente i valori ai puntatori in modo che il campo puntatore del nuovo nodo prenda il valore di TDL (inizio della lista) e TDL prenda il valore (pnuovo) del puntatore del nodo da inserire. Usando la precedente convenzione, i due passi possono essere realizzati mediante le seguenti istruzioni : pnuovo -> psucc = TDL TDL = pnuovo Gestione dinamica di una lista a cura del Prof. Salvatore DE GIORGI pag. 2
3 Operazione di Inserimento in coda Data la lista : per effettuare un inserimento in coda si devono effettuare i seguenti passi : 1) creare un nuovo nodo : dove : pnuovo è il nuovo puntatore assegnato al nodo. 2) assegnare opportunamente i valori ai puntatori in modo che il puntatore del nuovo nodo (pnuovo) venga assegnato alla parte puntatore dell ultimo nodo della lista. Per fare questo occorre, partendo dal primo nodo, scorrere tutta la lista fino ad arrivare all ultimo nodo in cui la parte puntatore è uguale a null e, quindi, effettuare l assegnazione precedentemente indicata. Operazione di Inserimento intermedio Data la lista : per effettuare un inserimento fra due nodi qualsiasi (indicati con X e Y) si devono effettuare i seguenti passi : 1) creare un nuovo nodo : dove : pnuovo è il nuovo puntatore assegnato al nodo. Gestione dinamica di una lista a cura del Prof. Salvatore DE GIORGI pag. 3
4 2) assegnare opportunamente i valori ai puntatori in modo che il puntatore del nodo Y (py contenuto nella parte puntatore di X) venga assegnato alla parte puntatore del nuovo nodo ed il puntatore del nuovo nodo (pnuovo) venga assegnato alla parte puntatore del nodo X : con i passi illustrati, il nodo nuovo è inserito fra i nodi X e Y : Gestione dinamica di una lista a cura del Prof. Salvatore DE GIORGI pag. 4
5 Operazione di Estrazione in testa Data la lista : per effettuare una estrazione in testa, si deve semplicemente eliminare il primo nodo della lista. Per fare ciò, è sufficiente che il puntatore di inizio lista (TDL) assuma il valore presente nella parte puntatore del primo nodo (il puntatore al secondo nodo della lista deve diventare il puntatore iniziale) : TDL = TDL -> psucc TDL -> psucc è uguale a p1 e, quindi, p1 diventa TDL (il puntatore di inizio lista). Operazione di Estrazione in coda Data la lista : per effettuare una estrazione in coda, si deve eliminare l ultimo nodo della lista. Per fare ciò si deve scorrere l'intera lista ed arrivare all'ultimo nodo (la cui parte puntatore è NULL) conservando il puntatore del nodo precedente, in cui si deve inserire la costante NULL nella sua parte puntatore. Per scorrere la lista si devono usare due puntatori di comodo : il puntatore p che punta al nodo attuale ed il puntatore pprec che punta a quello precedente. Quando la parte puntatore di p è NULL (ultimo nodo) si deve inserire nella parte puntatore di pprec la costante NULL. In questo modo il penultimo nodo diventa l ultimo nodo della lista : Gestione dinamica di una lista a cura del Prof. Salvatore DE GIORGI pag. 5
6 Operazione di Estrazione intermedia Data la lista : per effettuare l estrazione di un nodo (indicato con E) inserito fra due nodi qualsiasi (indicati con X e Y) si deve assegnare la parte puntatore (py) del nodo da estrarre alla parte puntatore del nodo precedente (pe). In questo modo nella parte puntatore di X viene inserito il puntatore (py) di Y che diventa successivo ad X, eliminando dalla lista il nodo E : Gestione dinamica di una lista a cura del Prof. Salvatore DE GIORGI pag. 6
7 Programma in C++ per la gestione dinamica di una lista Il programma per la gestione dinamica di una lista lineare deve prevedere, almeno, le seguenti funzioni : creazione di un nodo; controllo lista vuota; inserimento in testa di un nodo; inserimento in coda di un nodo; inserimento ordinato di un nodo; inserimento di un nodo in una data posizione; estrazione in testa di un nodo; estrazione in coda di un nodo; estrazione di un determinato nodo; visualizzazione lista completa; ricerca di un nodo; eliminazione della lista. da realizzare, per es., mediante il seguente menù : Gestione dinamica di una lista a cura del Prof. Salvatore DE GIORGI pag. 7
8 Analisi dei dati Identificatore Descrizione Tipo Input Output Lavoro nodo struttura dati contenente : struttura inf tipo intero psucc puntatore a nodo numero tdl pnuovo p pprec dato da inserire nel nodo della lista puntatore al primo elemento della lista puntatore del nuovo nodo creato puntatore di comodo per scorrere la lista (è il puntatore del nodo attuale) intero puntatore puntatore puntatore puntatore del nodo precedente a quello attuale puntatore si dati contenuti nei nodi della lista si si si Definizione ed inizializzazione delle variabili struct nodo int inf; struct nodo *psucc; // parte informazione del nodo (un solo dato) // dato di tipo puntatore alla struttura stessa // contiene l'indirizzo (puntatore) all'elemento // successivo della struttura // nodo *psucc; // dichiarazione semplificata alternativa ; nodo *tdl = NULL; nodo *pnuovo = NULL; nodo *p = NULL; nodo *pprec = NULL; // puntatore al primo elemento della lista // puntatore del nuovo nodo creato // puntatore di comodo per scorrere la lista // puntatore del nodo precedente a quello attuale // (per inserimenti ed estrazioni intermedie) Gestione dinamica di una lista a cura del Prof. Salvatore DE GIORGI pag. 8
9 Creazione di un nodo unzione CreaNodo numero I alloca (pnuovo) pnuovo->inf= numero pnuovo->psucc=null Return void CreaNodo(void) int numero; cout<<"\ndigita il valore da inserire nel nodo...: "; cin>>numero; pnuovo = new nodo; // dall'area heap viene prelevato un indirizzo // ed associato al nodo creato pnuovo->inf=numero; // il numero inserito è posto nella parte // informazione del nodo pnuovo->psucc=null; // nella parte puntatore del nodo viene // inserita la costante NULL return; Gestione dinamica di una lista a cura del Prof. Salvatore DE GIORGI pag. 9
10 Controllo lista vuota unzione Listauota vuota = T tdl = NULL Lista vuota O vuota = Return vuota bool Listauota() bool vuota = true; if (tdl == NULL) // se il punt. di inizio lista è nullo la lista è vuota cout <<" ATTENZIONE!! Lista vuota. "<<endl; vuota = false; return vuota; Gestione dinamica di una lista a cura del Prof. Salvatore DE GIORGI pag. 10
11 Operazione di scorrimento di una lista Lo scorrimento di una lista per effettuare elaborazioni sulla parte informativa dei nodi o per effettuare operazioni di inserimenti e/o estrazioni intermedie si può eseguire in due differenti modi : 1) Il seguente ciclo, usando un puntatore di comodo p, consente di scorrere, partendo dal nodo iniziale (il cui puntatore è tdl), tutta la lista fino all ultimo nodo : p = tdl; per partire dal primo nodo p diventa uguale al puntatore di inizio lista while (p!= NULL) si controlla se p è diventato NULL ovvero se è stato elaborato anche l'ultimo nodo istruzioni; p = p->psucc; p assume il valore presente nella parte puntatore del nodo attuale, ovvero il puntatore al nodo successivo all'uscita del ciclo il puntatore p è uguale a NULL, quindi non punta a nessun nodo (attenzione!! non è il puntatore dell'ultimo nodo). p = tdl p NULL istruzioni p = p->psucc 2) Il seguente ciclo, usando un puntatore di comodo p, consente di scorrere, partendo dal nodo iniziale (il cui puntatore è tdl), tutta la lista fino all ultimo nodo : p = tdl; per partire dal primo nodo p diventa uguale al puntatore di inizio lista while (p->psucc!= NULL) si controlla se la parte puntatore del nodo è NULL, ovvero se si tratta dell'ultimo nodo istruzioni; p = p->psucc; p assume il valore presente nella parte puntatore del nodo attuale, ovvero il puntatore al nodo successivo Gestione dinamica di una lista a cura del Prof. Salvatore DE GIORGI pag. 11
12 all'uscita del ciclo siamo arrivati all'ultimo nodo in cui la parte puntatore è NULL e, quindi, non esiste un nodo successivo. In questo caso l'ultimo nodo deve essere ancora sottoposto all'elaborazione interessata (per esempio la visualizzazione dell'intera lista) utilizzando la sua parte informativa (p->inf). p = tdl p->psucc NULL istruzioni p = p->psucc In genere quando si devono effettuare elaborazioni sulla parte informativa del nodo è necessario ricorrere al ciclo 1) mentre quando si effettuano operazioni sulla lista (inserimento intermedio, eliminazione in coda o intermedio) è necessario utilizzare il ciclo 2). Gestione dinamica di una lista a cura del Prof. Salvatore DE GIORGI pag. 12
13 Inserimento di un nodo in testa unzione InserimentoT CreaNodo() tdl NULL pnuovo->psucc=tdl tdl = pnuovo Return void InserimentoT(void) CreaNodo(); if (tdl!= NULL) pnuovo->psucc=tdl; tdl = pnuovo; // se la lista non è vuota // il punt. di inizio lista viene inserito nella // parte punt. del nuovo nodo // il punt. del nuovo nodo diventa, comunque, il // punt. di inizio lista return; Gestione dinamica di una lista a cura del Prof. Salvatore DE GIORGI pag. 13
14 Inserimento di un nodo in coda unzione InserimentoC CreaNodo() tdl = NULL p = tdl tdl = pnuovo p->psucc NULL p = p->psucc p->psucc=pnuovo Return void InserimentoC(void) CreaNodo(); if (tdl == NULL) // se la lista è vuota il nodo viene inserito in testa tdl=pnuovo; // il nuovo puntatore diventa il puntatore di inizio lista else // se la lista è piena si scorre fino all'ultimo nodo ed il nuovo puntatore viene inserito // nella parte puntatore dell'ultimo nodo (che diventa il penultimo) p = tdl; // tdl viene assegnato al puntatore di comodo while (p->psucc!= NULL) // ciclo per scorrere la lista fino all ultimo nodo p=p->psucc; // per scorrere la lista // fino ad arrivare all'ultimo nodo in cui nella parte // puntatore si inserisce il puntatore del nuovo nodo p->psucc=pnuovo; return; Gestione dinamica di una lista a cura del Prof. Salvatore DE GIORGI pag. 14
15 Inserimento ordinato di un nodo L algoritmo proposto consente di ottenere una lista i cui nodi risultano ordinati in senso crescente rispetto alla parte informativa. unzione Inserimento_Ordinato CreaNodo() tdl = NULL tdl->inf pnuovo->inf tdl = pnuovo p = tdl pnuovo->psucc = tdl p NULL AND pnuovo->inf > p->inf pprec= p tdl = pnuovo p = p->psucc pnuovo->psucc=p pprec->psucc = pnuovo Return Gestione dinamica di una lista a cura del Prof. Salvatore DE GIORGI pag. 15
16 void Inserimento_Ordinato(void) CreaNodo(); if (tdl == NULL) // se la lista è vuota il nodo inserito diventa tdl = pnuovo; // il primo nodo else // se il nodo da inserire con puntatore pnuovo è minore o uguale // al primo nodo della lista, si inserisce in tdl ovvero come primo nodo if (tdl->inf >= pnuovo->inf) pnuovo->psucc=tdl; tdl = pnuovo; else // si scorre la lista fino alla fine e finché il nodo pnuovo risulta maggiore del // nodo corrente. Se si arriva alla fine della lista o si trova un nodo maggiore // di quello pnuovo, si procede all'inserimento p = tdl; while ((p!= NULL) && (pnuovo->inf > p->inf)) pprec = p; // si salva il puntatore corrente p = p->psucc; // per scorrere la lista pnuovo->psucc = p; //inserimento intermedio pprec->psucc = pnuovo; Gestione dinamica di una lista a cura del Prof. Salvatore DE GIORGI pag. 16
17 Inserimento intermedio di un nodo in una data posizione unzione Inserimento_Nodo CreaNodo() pos I tdl = NULL pos = 1 tdl = pnuovo p = tdl pnuovo->psucc = tdl x = 1 p NULL AND x < pos tdl = pnuovo pprec= p p = p->psucc x = x + 1 pnuovo->psucc=p pprec->psucc = pnuovo Return Gestione dinamica di una lista a cura del Prof. Salvatore DE GIORGI pag. 17
18 void Inserimento_Nodo(void) int pos; // posizione richiesta int x; // per contare i nodi della lista CreaNodo(); cout<<"\ndigitare la posizione in cui inserire il nodo nella lista...: "; cin>>pos; if (tdl == NULL) // se la lista è vuota il nodo inserito diventa tdl = pnuovo; // il primo nodo else if (pos==1) // per la prima posizione si effettua l'inserimento in testa pnuovo->psucc=tdl; tdl = pnuovo; else x=1; p=tdl; /* si effettua un ciclo per scorrere la lista fino alla posizione richiesta e finchè la lista è piena. Se la posizione richiesta supera il numero di nodi presenti nella lista, il nodo viene inserito in coda. */ while (x < pos && p!= NULL) pprec = p; // si salva il puntatore corrente p = p->psucc; // per scorrere la lista ++x; // si contano i nodi pnuovo->psucc = p; //inserimento intermedio : vedi Nota1 pprec->psucc = pnuovo; Nota 1 : Inserimento intermedio di un nodo per inserire un nodo nuovo (puntatore pnuovo) fra due nodi qualsiasi occorre gestire il puntatore del primo nodo (pprec) ed il puntatore del secondo nodo (p). L'inserimento viene ottenuto inserendo il puntatore (p) del secondo nodo nella parte puntatore del nodo nuovo (pnuovo->psucc) ed inserendo il puntatore (pnuovo) del nuovo nodo nella parte puntatore del primo nodo (pprec->psucc). Gestione dinamica di una lista a cura del Prof. Salvatore DE GIORGI pag. 18
19 Estrazione di un nodo in testa unzione EstrazioneT Listauota()= T p = tdl tdl = p->psucc p->psucc = NULL tdl = NULL dealloca (p) Return void EstrazioneT(void) if (Listauota() == true) p = tdl; // p puntatore di comodo // se la lista è costituita da un solo nodo si elimina l'intera lista if (p->psucc == NULL) tdl = NULL; else tdl = p->psucc; delete p; return; Gestione dinamica di una lista a cura del Prof. Salvatore DE GIORGI pag. 19
20 Estrazione di un nodo in coda unzione EstrazioneC Listauota()= T pprec=null p = tdl p->psucc NULL pprec = p p = p->psucc dealloca(p) p=tdl pprrec->psucc=null tdl=null Return Gestione dinamica di una lista a cura del Prof. Salvatore DE GIORGI pag. 20
21 void EstrazioneC(void) if (Listauota() == true) p = tdl; // p puntatore di comodo per scorrere la lista // è il puntatore del nodo attuale pprec = NULL; // puntatore del nodo precedente a quello // attuale puntato dal puntatore p // il ciclo serve per scorrere l'intera lista ed arrivare all'ultimo nodo // conservando il puntatore del nodo precedente, in cui si deve // inserire la costante NULL nella sua parte puntatore while (p->psucc!= NULL) pprec = p; // si salva il puntatore corrente p = p->psucc; // per scorrere la lista delete p; // se la lista è costituita da un solo nodo si elimina l'intera lista if (p == tdl) tdl = NULL; else pprec->psucc = NULL; return; Gestione dinamica di una lista a cura del Prof. Salvatore DE GIORGI pag. 21
22 Estrazione di un determinato nodo (estrazione intermedia) Gestione dinamica di una lista a cura del Prof. Salvatore DE GIORGI pag. 22
23 void Estrazione_Nodo(void) int cerca; bool flag; if (Listauota() == true) cout<<"digitare il nodo da eliminare dalla lista...: "; cin>>cerca; p = tdl; pprec = NULL; if (p->inf == cerca) // il nodo da eliminare è il primo tdl = p->psucc; delete p; else flag = false; while (p!= NULL && flag == false) if (p->inf == cerca) pprec->psucc = p->psucc; // vedi Nota2 delete p; flag=true; else pprec = p; // si salva il puntatore corrente p = p->psucc; // per scorrere la lista if (flag==false) cout << "Nodo inesistente nella lista"<<endl; Nota 2 : Estrazione intermedia di un nodo per estrarre dalla lista un nodo posto fra due nodi qualsiasi occorre gestire il puntatore del nodo (pprec) precedente a quello da estrarre ed il puntatore del nodo da estrarre (p). L'estrazione viene ottenuta inserendo la parte puntatore del nodo da estrarre (p->psucc) nella parte puntatore del nodo precedente (pprec->psucc). In questo nodo viene così inserito il puntatore del nodo successivo a quello estratto. Gestione dinamica di una lista a cura del Prof. Salvatore DE GIORGI pag. 23
24 isualizzazione lista completa unzione isualizzazione Listauota()= T p = tdl p NULL p -> inf O p = p->psucc Return void isualizzazione(void) if (Listauota() == true) p = tdl; // p (puntatore di comodo) parte da tdl per scorrere tutta la lista while (p!= NULL) cout <<p->inf<<endl; p = p->psucc; return; Gestione dinamica di una lista a cura del Prof. Salvatore DE GIORGI pag. 24
25 Ricerca di un nodo unzione Ricerca Listauota()= T cerca I flag= p = tdl p NULL and flag= p->inf=cerca p = p->psucc flag= T flag = T non trovato O trovato O Return Gestione dinamica di una lista a cura del Prof. Salvatore DE GIORGI pag. 25
26 void Ricerca(void) int cerca; bool flag=false; if (Listauota() == true) cout<<"\n Digita il nodo da ricercare...: "; cin>>cerca; p = tdl; while (p!= NULL && flag == false) if (p->inf == cerca) flag=true; else p = p->psucc; // per scorrere la lista if (flag == true) cout << "\n Nodo trovato!!\n"; else cout << "\n Nodo non trovato\n"; return; Eliminazione della lista if (Listauota() == true) tdl = NULL; // per eliminare la lista è sufficiente // che il puntatore iniziale diventi NULL cout<<"\n Lista eliminata!!\n"; Nota : il programma completo si può consultare (e scaricare) nella sezione : Informatica quarto anno/programmi in C++/Gestione dinamica delle strutture di dati (lista, coda, pila)/gestione di una lista oppure direttamente da : Gestione dinamica di una lista a cura del Prof. Salvatore DE GIORGI pag. 26
Gestione dinamica di una coda
Gestione dinamica di una coda Una coda o queue è una lista lineare a lunghezza variabile in cui l'inserimento di nuovi elementi (push) viene effettuato ad un estremo (fondo o rear) e l'estrazione degli
DettagliGestione dinamica di una pila
Gestione dinamica di una pila Una pila o stack è una lista lineare a lunghezza variabile in cui inserimenti (push) ed estrazioni (pop) vengono effettuate ad un solo estremo, detto testa (top) della pila.
DettagliLaboratorio di Informatica
Liste semplici (semplicemente linkate) Una lista semplice e costituita da nodi Laboratorio di Informatica 7. Strutture complesse di dati in C++ Ogni nodo e una struttura che contiene : Dati Un riferimento
DettagliParte 4D. Liste doppie. R. Magritte Transfer, D.1
Parte 4D Liste doppie R. Magritte Transfer, 1966 4D.1 4D.2 Liste doppie Lista singolarmente concatenata o lineare: ciascun elemento contiene solo un puntatore al prossimo elemento Lista doppiamente concatenata
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
DettagliParte 4. Liste. P. Picasso Guernica, AA. 2015/16
Parte 4 Liste - AA. 2015/16 P. Picasso Guernica, 1937 4.1 4.2 Strutture dati complesse Per la risoluzione di alcuni problemi vi è la necessità di utilizzare strutture dati dinamiche e complesse Si consideri
DettagliLaboratorio Informatica Classe 4A Serale Venerdì 18/02/2011. Gruppo. Cognome Riontino Nome Raffaele. Cognome Nome
Laboratorio Informatica Classe 4A Serale Venerdì 18/02/2011 Gruppo Cognome Riontino Nome Raffaele Cognome Nome TRACCIA 2 ARGOMENTO: LISTE TEMPO: 4h 1. Utilizzando Typedef definire un nuovo tipo di dato
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
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
DettagliArgomenti della lezione. Introduzione agli Algoritmi e alle Strutture Dati. Lista Lineare. Lista Lineare come Tipo di Dato Astratto
Argomenti della lezione Introduzione agli Algoritmi e alle Strutture Dati Operazioni su Liste Dr. Emanuela Merelli Tipi di Dato Astratto Lista Lineare Pila Coda Concetto di Struttura dati dinamiche Lista
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
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
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
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
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 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 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
DettagliImplementazione dell albero binario in linguaggio C++
Implementazione dell albero binario in linguaggio C++ Costruire il programma per gestire le operazioni su un albero binario. Ogni nodo dell albero contiene un codice e una descrizione; il programma deve
DettagliLaurea In Ingegneria dell Informazione. Esercitazioni Guidate di Tecniche della Programmazione
Laurea In Ingegneria dell Informazione Esercitazioni Guidate di Tecniche della Programmazione Note introduttive: 1) Le soluzioni agli esercizi e le versioni di programmi menzionate nel testo delle esercitazioni
Dettaglicons: L E L (...), e (e,...) Operatori tradizionali sulle liste car: (e,...) cdr: What s LISTE? null: () TRUE (...) FALSE Una lista e' una
What s LISTE? Una lista e' una ( es. λ = {4, 9, 1 E = dominio degli elementi di lista (persone, voli, interi, lettere...) L = {λ / λ e' una lista di elementi in E Bool = {TRUE, FALSE cons: L E L (...),
DettagliCorso di Fondamenti di Informatica Algoritmi su array / 1
Corso di Informatica Algoritmi su array / Anno Accademico 200/20 Francesco Tortorella Algoritmi su array Quando si usano gli array, si eseguono frequentemente alcune operazioni tipiche : inizializzazione
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
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
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
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
DettagliRicerca binaria (o dicotomica) di un elemento in un vettore
Ricerca binaria (o dicotomica) di un elemento in un La ricerca binaria o dicotomica è utilizzata per ricercare i dati in un ORDNATO. L algoritmo di ricerca binaria, dopo ogni confronto, scarta metà degli
DettagliTecniche della Programmazione, M.Temperini, Liste Concatenate 3 1/18
Tecniche della Programmazione, M.Temperini, Liste Concatenate 3 1/18 Eliminazione di un elemento da una typedef int TipoElem; int main() { TipoLista ; TipoElem ; /* costruzione */ /* l'el. da eliminare
DettagliLe liste. Prof. Francesco Accarino IIS Sesto San Giovanni Via Leopardi 132
Le liste Prof. Francesco Accarino IIS Sesto San Giovanni Via Leopardi 132 Le Liste Le liste non sequenziali (concatenate) sono costituite da elementi che vengono memorizzati in memoria centrale non uno
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
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
DettagliProgrammazione Procedurale in Linguaggio C++
Programmazione Procedurale in Linguaggio C++ Strutture di Dati Parte 2 La Lista G. Mecca M. Samela Università della Basilicata Strutture di Dati: Lista >> Sommario Sommario Introduzione Definizione di
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
DettagliPUNTATORI. Ivan Lanese
PUNTATORI Ivan Lanese Argomenti Puntatori Liste Puntatori Un puntatore è un tipo di dato che contiene l'indirizzo di memoria di un altro tipo di dato In c+o i puntatori sono tipati: avremo puntatori a
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
DettagliCorso di Laurea Ingegneria Informatica Fondamenti di Informatica 2
Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2 Dispensa E14 F. Gasparetti, C. Limongelli Maggio 2012 1 Verifica presenza di elementi comuni V1 - Date due liste di stringhe scrivere
DettagliInserimento di un elemento in coda. quale va collegato quello nuovo. ultimo. *lista 8 3. aux. ultimo. *lista 8 3. aux
Inserimento di un elemento in coda Se la è vuota coincide con l inserimento in testa = è necessario il passaggio per indirizzo! Se la non è vuota, bisogna scandirla fino in fondo = dobbiamo usare un puntatore
Dettaglistruct costobiglietto { //struttura per prezzo float prezzo; float tasse; float prezzototale; };
/* Programma 12cppEse1.cpp Autore : Riontino Raffaele 4 informatici ITIS Molinari - Milano corso serale 2/11/2010 Testo : Si vuole realizzare un tipo struct, utilizzato per informazioni su biglietti per
DettagliESERCIZIO 1. AZ111 milano 12:34 23 AZ222 buenos-aires 12: BA333 toronto 4:15 20 KM444 madrid 10:12 100
ESERCIZIO 1 Scrivete un programma per la gestione delle informazioni relative ai voli giornalieri in partenza da un certo aeroporto. Il programma deve leggere da file le informazioni relative ai voli,
DettagliAlgoritmo di ordinamento per sostituzione. Esempio : dato l array :
Algoritmo di ordinamento per sostituzione Per ottenere un ordinamento crescente con l algoritmo di ordinamento per Sostituzione si confronta l elemento nella prima posizione con gli elementi nelle posizioni
DettagliHeap e code di priorità
Heap e code di priorità Violetta Lonati Università degli studi di Milano Dipartimento di Scienze dell Informazione Laboratorio di algoritmi e strutture dati Corso di laurea in Informatica AA 2009/2010
DettagliLE STRUTTURE DATI DINAMICHE: GLI ALBERI. Cosimo Laneve
LE STRUTTURE DATI DINAMICHE: GLI ALBERI Cosimo Laneve 1 argomenti 1. definizione di alberi e nozioni relative 2. implementazione degli alberi, creazione, visita 3. algoritmo di visita iterativa e sua implementazione
DettagliAlgoritmo di ordinamento per scambio (a bolle o bubble sort)
Algoritmo di ordinamento per scambio (a bolle o bubble sort) Per ottenere un ordinamento crescente con l algoritmo di ordinamento per scambio (bubble sort) si prenno in considerazione i primi due elementi
DettagliInserimento in una lista ordinata
Inserimento in una lista ordinata Vogliamo inserire un nuovo elemento in una lista in cui gli elementi sono memorizzati in ordine crescente: Passo 1: creare un nuovo nodo della lista Passo 2: trovare il
DettagliListe. Una lista è una struttura dati (formata da elementi dello stesso tipo e collegati insieme) la cui lunghezza può variare dinamicamente.
Liste Una lista è una struttura dati (formata da elementi dello stesso tipo e collegati insieme) la cui lunghezza può variare dinamicamente. I suoi elementi sono variabili dinamiche che vengono creati
Dettaglie e n-1 Esercizio 1.2 (Punti 8; punti 10 se risolto facendo uso della ricorsione)
Informatica 1 Seconda prova 31 Gennaio 2006 Esercizio 1 (Punti Una lista bidirezionale è una lista in cui ogni elemento è collegato, mediante puntatori, all elemento seguente e a quello precedente; alla
DettagliCorso di Fondamenti di Informatica Prof. Aldo Franco Dragoni Prova scritta del 21/06/2010. Avvertenze. Specifiche
Avvertenze Usare ESCLUSIVAMENTE penne ad inchiostro nero o blu (NO MATITE). Consegnare solo fogli formato A4 scritti da ambo le parti. In testa a ciascun foglio scrivere: cognome, nome, numero progressivo
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
DettagliAlgoritmi e Strutture Dati
Algoritmi e Strutture Dati Università di Camerino Corso di Laurea in Informatica (12 CFU) I periodo didattico Emanuela Merelli email:emanuela.merelli@unicam.it Argomenti della lezione Tipi di Dato Astratto
DettagliStruttura dati astratta Coda
CODE Struttura dati astratta Coda La coda o queue è una struttura dati astratta in cui l'inserimento e l estrazione sono consentite solo in specifiche posizioni; in particolare, l'inserimento è consentito
DettagliPolitecnico di Milano - Dipartimento di Elettronica e informazione Prof. Mauro Negri
Politecnico di Milano - Dipartimento di Elettronica e informazione Prof. Mauro Negri Fondamenti di Informatica II prova in itinere 25 gennaio 2011 Matricola Cognome Nome Durata prova: 2 ore Istruzioni
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
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
DettagliOperazioni su liste. Creazione della lista (vuota e successivi inserimenti) Lettura di una lista Stampa di una lista Cancellazione di una lista
Oerazioni su liste Creazione della lista (vuota e successivi inserimenti) Lettura di una lista Stama di una lista Cancellazione di una lista Inserimento in lista Estrazione da lista Inserimento in lista
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
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
Dettagli#include <iostream> #include <cstring> #include <fstream> using namespace std; struct elem{ char parola[31]; elem *pun; };
#include #include #include using namespace std; struct elem{ char parola[31]; elem *pun; ; struct Dizionario{ elem *testa; ; void inizializzadizionario(dizionario &D){ D.testa
DettagliListe singolarmente linkate
liste Liste singolarmente linkate Una lista è una struttura dati costituita da un insieme di nodi collegati da puntatori 10 4 7 15 / In una lista singolarmente linkata ogni nodo è composto da : Il valore
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
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
DettagliStruct e liste concatenate
Struct e liste concatenate Alessio Orlandi 20 aprile 2010 Tipi complessi Tipi scalari: int, float,... : singolo elemento Contenitori per collezioni di oggetti: array. Quindi: array di interi, array di
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
DettagliPOLITECNICO DI MILANO ESAME DI INFORMATICA 3 Prof.ssa Sara Comai Anno Accademico 2003/2004 I Prova in itinere - Laurea On Line SOLUZIONI
POLITECNICO DI MILANO ESAME DI INFORMATICA 3 Prof.ssa Sara Comai Anno Accademico 2003/2004 I Prova in itinere - Laurea On Line SOLUZIONI ESERCIZIO 2 (SEMANTICA) 1) Passaggio dei parametri per valore 3
DettagliTipi strutturati - struct
Fondamenti di Programmazione A Appunti per le lezioni Gianfranco Rossi Tipi strutturati - struct Struttura dati (concreta) struct: sequenza di n elementi (n 0), rispettivamente di tipo t1,,tn (non necessariamente
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
DettagliLE STRUTTURE DATI DINAMICHE
LE TRUTTURE DTI DIMICHE Talvolta è necessario allocare spazio di memoria durante l esecuzione di un programma oppure creare variabili di durata temporanea. Esempio: Leggere e memorizzare dei numeri interi
DettagliAlgoritmi di Ricerca. Esempi di programmi Java
Fondamenti di Informatica Algoritmi di Ricerca Esempi di programmi Java Fondamenti di Informatica - D. Talia - UNICAL 1 Ricerca in una sequenza di elementi Data una sequenza di elementi, occorre verificare
DettagliLinked Lists. Liste linkate (1) Progettazione: struct. Liste linkate (2)
Liste linkate () Linked Lists La combinazione di class/struct e puntatori porta alla creazioni di interessanti Abstract Data Type liste linkate ( stack, queues ), trees Liste linkate come strutture struct
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
DettagliAlbero binario. Alberi binari (introduzione) Terminologia. Alberi di ricerca binaria (BST)
Albero binario 2 Alberi binari (introduzione) Struttura di dati bidimensionale formata da nodi costituiti ciascuno dai dati da memorizzare e da due link Ver. 2.4 20 - Claudio Fornaro - Corso di programmazione
DettagliCorso di Informatica A.A
Corso di Informatica A.A. 2009-2010 Lezione 15 Corso di Informatica 2009-2010 Lezione 15 1 Liste concatenate Liste concatenate Una lista concatenata costituisce un metodo molto utile per immagazzinare
DettagliListe a puntatori: un esercizio passo passo
Liste a puntatori: un esercizio passo passo Prof. Orazio Mirabella Liste a puntatori: un esercizio passo passo (for dummies) Prof. Orazio Mirabella 1 Ripassiamo le Liste lineari Una lista lineare è una
DettagliCesare Rota. Programmare con C++
Cesare Rota Programmare con C++ Questo fascicolo deve essere allegato al volume Programmare con C++ di Cesare Rota ISBN 978-88-203-4248-7, ne è parte integrante e non può essere venduto separatamente EDITORE
Dettagli#include <stdio.h> #include <stdlib.h> //necessaria per la malloc #include <string.h> // costante #define MAX_L 30
/* Dopo aver definito una lista in grado di contenere i dati di alcune persone (nome, genere e altezza in metri), scrivere un programma che consenta di verificare che inizialmente la lista sia vuota e
DettagliAlgoritmi e Strutture di Dati A.A Esempio di prova scritta del 19 gennaio 2018 D.M CFU Libri e appunti chiusi Tempo = 2:00h
Algoritmi e Strutture di Dati A.A. 2017-2018 Esempio di prova scritta del 19 gennaio 2018 D.M. 270-9CFU Libri e appunti chiusi Tempo = 2:00h Note (es: correzione veloce, eventuali indisponibilità, ecc.)...
DettagliLezione 8 Liste. Rossano Venturini. Pagina web del corso.
Lezione 8 Liste Rossano Venturini rossano.venturini@unipi.it Pagina web del corso http://didawiki.cli.di.unipi.it/doku.php/informatica/all-b/start Esercizio 1 Prova del 18/05/2009 Scrivere un programma
DettagliLezione 10 Liste. Rossano Venturini. Pagina web del corso.
Lezione 10 Liste Rossano Venturini rossano@di.unipi.it Pagina web del corso http://didawiki.cli.di.unipi.it/doku.php/informatica/all-b/start Esercizio 1 Prova del 18/05/2009 Scrivere un programma che legga
DettagliStrutture dati dinamiche in C (II)
Strutture dati dinamiche in C (II) Laboratorio di Linguaggi di Programmazione a.a. 2001/2002 dott.ssa Francesca A. Lisi lisi@di.uniba.it Sommario Le liste concatenate (ancora ma in modo più formale) L
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
DettagliRappresentazione collegata mediante puntatori di una lista
Rappresentazione collegata mediante puntatori di una lista 1 Rappresentazione collegata di una lista Gli elementi di una lista possono essere rappresentati mediante delle struct contenenti, oltre al dato
DettagliLinked Lists. Liste linkate (1) liste linkate ( stack, queues ), trees. Liste linkate come strutture
Linked Lists Liste linkate () La combinazione di class/struct e puntatori porta alla creazioni di interessanti Abstract Data Type liste linkate ( stack, queues ), trees Liste linkate come strutture struct
DettagliAlgoritmi di Ricerca. Esempi di programmi Java
Fondamenti di Informatica Algoritmi di Ricerca Esempi di programmi Java Fondamenti di Informatica - D. Talia - UNICAL 1 Ricerca in una sequenza di elementi Data una sequenza di elementi, occorre verificare
DettagliCorso di Fondamenti di Informatica. Puntatori e Allocazione Dinamica
Corso di Fondamenti di Informatica Puntatori e Allocazione Dinamica I puntatori (Richiamo) Il C++ prevede puntatori a dati di qualsiasi natura, semplici o strutturati e puntatori a funzione. In particolare
DettagliStrutture Dati per Inserimento Ordinato. Luca Abeni
Strutture Dati per Inserimento Ordinato Luca Abeni Esempio: Ordinamento di Numeri A cosa servono i tipi di dato strutturati? Non bastano i tipi scalari? Capiamolo con un esempio... Problema: dato un insieme
DettagliParte 4C. Liste ordinate. H. Matisse Dance I, 1909 H. Matisse Dance, B.1
4B.1 Parte 4C Liste ordinate H. Matisse Dance I, 1909 H. Matisse Dance, 1910 4B.2 Lista ordinata Una lista è ordinata se l'ordine con cui compaiono gli elementi corrisponde ad un qualche ordinamento tra
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
DettagliIl tipo astratto coda con priorità: specifiche sintattiche e semantiche. Realizzazioni.
Il tipo astratto coda con priorità: specifiche sintattiche e semantiche. Realizzazioni. Algoritmi e Strutture Dati + Lab A.A. 14/15 Informatica Università degli Studi di Bari Aldo Moro Nicola Di Mauro
DettagliEsercizi su programmazione ricorsiva 1. Pericle Perazzo 23 marzo 2012
su programmazione ricorsiva 1 Pericle Perazzo pericle.perazzo@iet.unipi.it http://info.iet.unipi.it/~fondii/ 23 marzo 2012 Ripasso di programmazione ricorsiva Ripasso di programmazione ricorsiva Algoritmo
DettagliI PUNTATORI E LE STRUTTURE DATI DINAMICHE. Cosimo Laneve/Ivan Lanese
I PUNTATORI E LE STRUTTURE DATI DINAMICHE Cosimo Laneve/Ivan Lanese argomenti 1. dichiarazioni di puntatori 2. le operazione su puntatori (NULL, new, delete, &, *) 3. puntatori passati come parametri e
DettagliProgrammazione I - corso B a.a prof. Viviana Bono
Università di Torino Facoltà di Scienze MFN Corso di Studi in Informatica Programmazione I - corso B a.a. 2009-10 prof. Viviana Bono Blocco 14 Array parzialmente riempiti. Algoritmi sugli array. Arrayparzialmente
DettagliEsercitazioni di Tecniche di Programmazione. 4. Quarta esercitazione autoguidata: liste concatenate rappresentate mediante struct e puntatori
Esercitazioni di Tecniche di Programmazione 4. Quarta esercitazione autoguidata: liste concatenate rappresentate mediante struct e puntatori due avvertenze: 1) Le soluzioni agli esercizi, le versioni di
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
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
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
DettagliLezione 15 programmazione in Java. Nicola Drago Dipartimento di Informatica Università di Verona
Lezione 15 programmazione in Java Nicola Drago nicola.drago@univr.it Dipartimento di Informatica Università di Verona Anteprima Approfondimenti della programmazione OO Il modificatore abstract Le classi
DettagliAlgoritmi di Ricerca. Esempi di programmi Java. Prof. Angela Bonifati
Passaggio dei parametri in Java Nel seguente esempio public class parametri2 public static void main(string args[]) int x = 1; int y; double d[] = new double[2]; d[0] = 25; y= metodo1(d, x); System.out.println("Il
DettagliAlgoritmi e Strutture Dati. Lezione 3
Algoritmi e Strutture Dati Lezione 3 www.iet.unipi.it/a.virdis Antonio Virdis antonio.virdis@unipi.it 1 Sommario Alberi Binari di Ricerca Gestione Stringhe Progettazione Esercizi 2 3 4 Alberi Binari 10
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
Dettagli