c. gaibisso programmazione di calcolatori lezione xxii la struttura di dati lista di variabili...

47
C. Gaibisso Programmazione di Programmazione di Calcolatori Calcolatori Lezione XXII La struttura di dati “lista di variabili strutturate” Programmazione di Calcolatori: le liste di variabili strutturate 1

Upload: quirino-berardi

Post on 02-May-2015

214 views

Category:

Documents


2 download

TRANSCRIPT

Page 1: C. Gaibisso Programmazione di Calcolatori Lezione XXII La struttura di dati lista di variabili strutturate Programmazione di Calcolatori: le liste di

C. Gaibisso Programmazione di Programmazione di CalcolatoriCalcolatori

Lezione XXIILa struttura di dati “lista di variabili strutturate”

Programmazione di Calcolatori: le liste di variabili strutturate 1

Page 2: C. Gaibisso Programmazione di Calcolatori Lezione XXII La struttura di dati lista di variabili strutturate Programmazione di Calcolatori: le liste di

C. Gaibisso

Lista di recordLista di record

Programmazione di Calcolatori: le liste di variabili strutturate 2

• Definizione:

- insieme omogeneo di record collegati tra loro tramite puntatori in modo tale che, dato un record, che non sia l’ultimo della lista, è sempre possibile accedere al suo successore

- un puntatore permette l’accesso al primo elemento della lista

Page 3: C. Gaibisso Programmazione di Calcolatori Lezione XXII La struttura di dati lista di variabili strutturate Programmazione di Calcolatori: le liste di

C. Gaibisso

Lista di recordLista di record

Programmazione di Calcolatori: le liste di variabili strutturate 3

• Graficamente:

… … … … NULL

struct item {…….struct item *next;};

struct item *lista

Page 4: C. Gaibisso Programmazione di Calcolatori Lezione XXII La struttura di dati lista di variabili strutturate Programmazione di Calcolatori: le liste di

C. Gaibisso

Lista di interi: definizione dei Lista di interi: definizione dei tipitipi

Programmazione di Calcolatori: le liste di variabili strutturate 4

// definizione del tipo strutturato di un elemento // della lista di interistruct ldi_item {

// valore dell'elementoint valore;// riferimento al prossimo elementostruct ldi_item *successivo;};

// definizione del tipo di una lista di interitypedef struct ldi_item * ldi;

Page 5: C. Gaibisso Programmazione di Calcolatori Lezione XXII La struttura di dati lista di variabili strutturate Programmazione di Calcolatori: le liste di

C. Gaibisso Generazione di un nuovo Generazione di un nuovo elementoelemento

Programmazione di Calcolatori: le liste di variabili strutturate 5

• La logica:

struct ldi_item *new_item

NULL

VALORE

• La funzione:// Alloca memoria e inizializza un nuovo elemento della lista

struct ldi_item *itemIni(int valore){// definisce un puntatore per il nuovo elemento della listastruct ldi_item *new_item;// alloca memoria per il nuovo elementonew_item = (struct ldi_item *) malloc(sizeof(struct ldi_item));if (new_item != NULL) // se l’operazione ha esito positivo

{ // inizializza opportunamente i campi valore e successivonew_item -> valore = valore; new_item -> successivo= NULL; };

// restituisce il riferimento al nuovo elemento, se allocato con successo,

// NULL altrimentireturn(new_item);};

Page 6: C. Gaibisso Programmazione di Calcolatori Lezione XXII La struttura di dati lista di variabili strutturate Programmazione di Calcolatori: le liste di

C. Gaibisso

Inizializzazione di una listaInizializzazione di una lista

Programmazione di Calcolatori: le liste di variabili strutturate 6

• La logica:

NULL

ldi lista

// Inizializza una lista di interi a lista vuotavoid ldiIni (ldi *lista)

{// inizializza la lista a lista vuota*lista = NULL;};

• La funzione:

Page 7: C. Gaibisso Programmazione di Calcolatori Lezione XXII La struttura di dati lista di variabili strutturate Programmazione di Calcolatori: le liste di

C. Gaibisso

Scansione di una listaScansione di una lista

Programmazione di Calcolatori: le liste di variabili strutturate 7

• La logica:

• Il codice:

ldi lista

… …

NULL

… …

struct ldi_item *ptr

// tipo delle variabili coinvolte ldi lista;struct ldi_item *ptr;…ptr = lista;// scansionewhile (ptr != NULL)

{…ptr = ptr -> successivo;};

Page 8: C. Gaibisso Programmazione di Calcolatori Lezione XXII La struttura di dati lista di variabili strutturate Programmazione di Calcolatori: le liste di

C. Gaibisso Inserimento di un nuovo Inserimento di un nuovo elementoelemento

Programmazione di Calcolatori: le liste di variabili strutturate 8

NULL

struct ldi_item *new_item

ldi lista

NULL

… … …

(1)

X

(2)

• La logica:

Page 9: C. Gaibisso Programmazione di Calcolatori Lezione XXII La struttura di dati lista di variabili strutturate Programmazione di Calcolatori: le liste di

C. Gaibisso

Inserimento di un elementoInserimento di un elemento

Programmazione di Calcolatori: le liste di variabili strutturate 9

// Costanti simboliche per gli esiti di una operazione#define NEG_RESULT 0#define POS_RESULT 1

// Aggiunge un nuovo elemento in testa alla listaint ldiIns(ldi *lista, int valore)

{// definisce un puntatore al nuovo elementostruct ldi_item *item; // inizializza il nuovo elementoitem = itemIni(valore); // se la generazione del nuovo elemento fallisce

termina con esito // negativoif (item == NULL)

return(NEG_RESULT);// altrimenti inserisce il nuovo elemento in testa alla

listaitem -> successivo = *lista;*lista = item;// termina con esito positivoreturn(POS_RESULT);};

• La funzione:

Page 10: C. Gaibisso Programmazione di Calcolatori Lezione XXII La struttura di dati lista di variabili strutturate Programmazione di Calcolatori: le liste di

C. Gaibisso Cancellazione di un Cancellazione di un elementoelemento

Programmazione di Calcolatori: le liste di variabili strutturate 10

• La logica:

primo della lista:

struct ldi_item *temp

ldi lista… … …

NULL

(1)

X

(2)

X(3)

Page 11: C. Gaibisso Programmazione di Calcolatori Lezione XXII La struttura di dati lista di variabili strutturate Programmazione di Calcolatori: le liste di

C. Gaibisso Cancellazione di un Cancellazione di un elementoelemento

Programmazione di Calcolatori: le liste di variabili strutturate 11

altrimenti:

struct ldi_item *del

lista… …

NULL

… …

struct ldi_item *item

riferimento all’elemento precedente a quello oggetto della cancellazione

(1)

(2)

elemento interessato dalla cancellazione

X X(3)

Page 12: C. Gaibisso Programmazione di Calcolatori Lezione XXII La struttura di dati lista di variabili strutturate Programmazione di Calcolatori: le liste di

C. Gaibisso Cancellazione di un Cancellazione di un elementoelemento

Programmazione di Calcolatori: le liste di variabili strutturate 12

// Individua, se esiste, l'elemento che memorizza il valore, se e' il primo// della lista; l'elemento a questo precedente, altrimenti.struct ldi_item *ldiCercaCanc (ldi lista, int valore)

{// se la lista e' vuota restituisce NULLif (ldiEmpty(lista))

return(NULL);// se l'elemento cercato è il primo della lista ne restituisce il

riferimentoif (lista -> valore == valore)

return(lista);// altrimenti scandisce la lista alla ricerca dell’elemento

precedente// a quello che memorizza il valore cercatowhile (lista -> successivo != NULL)

// restituisce il riferimento all'elemento corrente, se l'elemento // a questo successivo memorizza il valore cercato

if (lista -> successivo -> valore == valore)return(lista);

else// altrimenti considera l'elemento successivo a quello

correntelista = lista -> successivo;

// restituisce NULL se la lista non memorizza il valorereturn(NULL);};

• Le funzioni:

Con

tinu

a …

Page 13: C. Gaibisso Programmazione di Calcolatori Lezione XXII La struttura di dati lista di variabili strutturate Programmazione di Calcolatori: le liste di

C. Gaibisso Cancellazione di un Cancellazione di un elementoelemento

Programmazione di Calcolatori: le liste di variabili strutturate 13

// cancella dalla lista il primo elemento che memorizza il valoreint ldiCancItem(ldi *lista, int valore)

{// definisce una variabile per il riferimento all'elemento

da cancellare,// se e' il primo della lista; al suo predecessore altrimentistruct ldi_item *item; // definisce una variabile di appoggio per il riferimento

all'elemento // da cancellarestruct ldi_item *del; // individua tale riferimento item = ldiCercaCanc (*lista, valore); // se il valore in input non compare nella lista termina

con esito// negativoif (item == NULL)

return(NEG_RESULT);

• Le funzioni:

Con

tinu

a …

Page 14: C. Gaibisso Programmazione di Calcolatori Lezione XXII La struttura di dati lista di variabili strutturate Programmazione di Calcolatori: le liste di

C. Gaibisso Cancellazione di un Cancellazione di un elementoelemento

Programmazione di Calcolatori: le liste di variabili strutturate 14

// gestisce il caso in cui l'elemento da cancellare è il primo della lista if (item -> valore == valore)

{ // salva il riferimento all'elemento da cancellare

del = item;// elimina l'elemento dalla lista

*lista = (*lista) -> successivo; } else { // altrimenti salva il riferimento all'elemento da cancellare

del = item -> successivo;// elimina l'elemento dalla listaitem -> successivo = item -> successivo -> successivo;};

// recupera la memoria allocata per l'elemento eliminato dalla lista

free(del); // termina con esito positivoreturn(POS_RESULT);};

• Le funzioni:

Page 15: C. Gaibisso Programmazione di Calcolatori Lezione XXII La struttura di dati lista di variabili strutturate Programmazione di Calcolatori: le liste di

C. Gaibisso Gestione di una lista di Gestione di una lista di interiinteri

Programmazione di Calcolatori: le liste di variabili strutturate 15

• Specifiche:

implementare una soluzione per la gestione di una lista di interi che preveda le seguenti funzionalità:

1.inserimento nella lista di una variabile strutturata per un valore intero

2.cancellazione dalla lista della variabile strutturata per la prima occorrenza di un valore intero

3.verifica della presenza di almeno una variabile strutturata per un valore intero

4.calcolo della lunghezza della lista

5.test di lista vuota

Page 16: C. Gaibisso Programmazione di Calcolatori Lezione XXII La struttura di dati lista di variabili strutturate Programmazione di Calcolatori: le liste di

C. Gaibisso Organizzazione del codice: file e Organizzazione del codice: file e contenutocontenuto

Programmazione di Calcolatori: le liste di variabili strutturate 16

• Definizione dei tipi:– ldi_tipi.h: definizioni dei tipi, strutturati e non,

per la gestione della lista di interi

• Codice sorgente:– ldi_main.c: codice per l’attivazione delle

funzionalità di gestione della lista di interi– ldi_ges.c: definizione delle funzioni per la

gestione della lista di interi come da specifiche– ldi_uti.c: definizione delle utilities di supporto

alle funzioni per la gestione della lista di interi

• Dichiarazioni extern– ldi_ges.h: dichiarazioni extern delle funzioni per

la gestione della lista di interi come da specifiche

– ldi_uti.h: dichiarazioni extern delle utilities di supporto alle funzioni per la gestione della lista di interi

Page 17: C. Gaibisso Programmazione di Calcolatori Lezione XXII La struttura di dati lista di variabili strutturate Programmazione di Calcolatori: le liste di

C. Gaibisso Organizzazione del codice: file e Organizzazione del codice: file e contenutocontenuto

Programmazione di Calcolatori: le liste di variabili strutturate 17

• Pseudodichiarazioni:– ldi_const.h: pseudodichiarazioni per le costanti

simboliche utilizzate nella gestione della lista di interi

– ldi_msg.h: pseudodichiarazioni per i messaggi restituiti nella gestione della lista di interi

Page 18: C. Gaibisso Programmazione di Calcolatori Lezione XXII La struttura di dati lista di variabili strutturate Programmazione di Calcolatori: le liste di

C. Gaibisso Gestione di una lista di interi: file Gestione di una lista di interi: file ldi_tipi.hldi_tipi.h

Programmazione di Calcolatori: le liste di variabili strutturate 18

// Nome e posizione del file:// Lezione_XXII/ldi_tipi.h// Descrizione del contenuto del file:// contiene le definizioni dei tipi, strutturati e non, // per la gestione di una lista di interi// definizione del tipo strutturato elemento di una lista di interistruct ldi_item {

// valore dell'elementoint valore;// riferimento al prossimo elementostruct ldi_item *successivo;};

// definizione del tipo lista di interitypedef struct ldi_item * ldi;

Page 19: C. Gaibisso Programmazione di Calcolatori Lezione XXII La struttura di dati lista di variabili strutturate Programmazione di Calcolatori: le liste di

C. Gaibisso Gestione di una lista di interi: file Gestione di una lista di interi: file ldi_ges.cldi_ges.c

Programmazione di Calcolatori: le liste di variabili strutturate 19

// Nome e posizione del file:// Lezione_XXII/ldi_ges.c// Descrizione del contenuto del file:// definizione delle funzioni per la gestione di una lista di interi// PSEUDODICHIARAZIONI// pseudodichiarazioni per i messaggi restituiti nella gestione di una // lista di interi#include "./ldi_msg.h"// pseudodichiarazioni per le costanti simboliche// utilizzate nella gestione di una lista di interi#include "./ldi_const.h"// DEFINIZIONI DI TIPO// definizioni dei tipi, strutturati e non, per la gestione di una lista di interi#include "./ldi_tipi.h"// DICHIARAZIONI EXTERN// inclusione del file di intestazione della libreria standard che contiene // definizioni di macro, costanti e dichiarazioni di funzioni e tipi funzionali// alle varie operazioni di I/O#include <stdio.h>// dichiarazioni extern delle utilities di supporto alle funzioni per la gestione di //una lista di interi#include "./ldi_uti.h"

Con

tinu

a …

Page 20: C. Gaibisso Programmazione di Calcolatori Lezione XXII La struttura di dati lista di variabili strutturate Programmazione di Calcolatori: le liste di

C. Gaibisso Gestione di una lista di interi: file Gestione di una lista di interi: file ldi_ges.cldi_ges.c

Programmazione di Calcolatori: le liste di variabili strutturate 20

// Nome della funzione:// ldiEmpty()// Tipo, nome e significato dei parametri della funzione:// ldi lista:riferimento al primo elemento della lista di// interi// Descrizione della funzionalita' implementata:// implementa il test di lista vuota// Tipo e significato del valore restituito:// int: TRUE se la lista è vuota;// FALSE altrimentiint ldiEmpty(ldi lista)

{// restituisce TRUE se la lista è vuota, FALSE

altrimentiif (lista == NULL)

return(TRUE);else

return(FALSE);};

Con

tinu

a …

Page 21: C. Gaibisso Programmazione di Calcolatori Lezione XXII La struttura di dati lista di variabili strutturate Programmazione di Calcolatori: le liste di

C. Gaibisso Gestione di una lista di interi: file Gestione di una lista di interi: file ldi_ges.cldi_ges.c

Programmazione di Calcolatori: le liste di variabili strutturate 21

// Nome della funzione:// ldiIns()// Tipo, nome e significato dei parametri della funzione:// ldi *lista: riferimento al puntatore di accesso alla lista di interi// int valore: valore da inserire// Descrizione della funzionalita' implementata:// aggiunge un nuovo elemento in testa alla lista// Tipo e significato del valore restituito:// int: POS_RESULT se l'operazione ha avuto esito positivo;// NEG_RESULT altrimentiint ldiIns(ldi *lista, int valore)

{// definisce un puntatore al nuovo elementostruct ldi_item *item; // inizializza il nuovo elementoitem = itemIni(valore); // se la generazione del nuovo elemento fallisce termina con

esito // negativoif (item == NULL)

return(NEG_RESULT);// altrimenti inserisce il nuovo elemento in testa alla listaitem -> successivo = *lista;*lista = item;// termina con esito positivoreturn(POS_RESULT);};

Con

tinu

a …

Page 22: C. Gaibisso Programmazione di Calcolatori Lezione XXII La struttura di dati lista di variabili strutturate Programmazione di Calcolatori: le liste di

C. Gaibisso Gestione di una lista di interi: file Gestione di una lista di interi: file ldi_ges.cldi_ges.c

Programmazione di Calcolatori: le liste di variabili strutturate 22

// Nome della funzione:// ldiVis()// Tipo, nome e significato dei parametri della funzione:// ldi lista: riferimento al primo elemento della lista di interi// Descrizione della funzionalita' implementata:// visualizza gli interi memorizzati dalla lista// Tipo e significato del valore restituito:// alcunovoid ldiVis (ldi lista)

{// se la lista è vuota memorizza un opportuno messaggioif (ldiEmpty(lista))

printf(EMPTY_LOI);// altrimentielse

{printf(LIST);// scandisce la listawhile (lista != NULL)

{// visualizza il contenuto dell'elemento correnteprintf("->%d", lista -> valore);// considera l'elemento successivo a quello correntelista = lista -> successivo;};

};};

Con

tinu

a …

Page 23: C. Gaibisso Programmazione di Calcolatori Lezione XXII La struttura di dati lista di variabili strutturate Programmazione di Calcolatori: le liste di

C. Gaibisso Gestione di una lista di interi: file Gestione di una lista di interi: file ldi_ges.cldi_ges.c

Programmazione di Calcolatori: le liste di variabili strutturate 23

// Nome della funzione:// ldiCancItem()// Tipo, nome e significato dei parametri della funzione:// ldi *lista: riferimento al puntatore di accesso alla lista di interi// int valore: valore da eliminare// Descrizione della funzionalita' implementata:// cancella dalla lista il primo elemento che memorizza il valore// Tipo e significato del valore restituito:// int: l'esito dell'operazione: POS_RESULT se il valore e' presente// NEG_RESULT altrimentiint ldiCancItem(ldi *lista, int valore)

{// definisce una variabile per il riferimento all'elemento// oggetto della cancellazione, se e' il primo della lista;// al suo predecessore altrimentistruct ldi_item *item; // definisce una variabile per il riferimento all'elemento

oggetto// della cancellazionestruct ldi_item *del; // individua tale riferimento e lo memorizzaitem = ldiCercaCanc (*lista, valore); // se il valore in input non compare nella lista termina con

esito// negativoif (item == NULL)

return(NEG_RESULT);

Con

tinu

a …

Page 24: C. Gaibisso Programmazione di Calcolatori Lezione XXII La struttura di dati lista di variabili strutturate Programmazione di Calcolatori: le liste di

C. Gaibisso Gestione di una lista di interi: file Gestione di una lista di interi: file ldi_ges.cldi_ges.c

Programmazione di Calcolatori: le liste di variabili strutturate 24

// gestisce il caso in cui l'elemento da cancellare è il primo della lista

if (item -> valore == valore){// salva il riferimento all'elemento da cancellaredel = item; // elimina l'elemento dalla lista*lista = (*lista) -> successivo;}

else{ // altrimenti salva il riferimento all'elemento da cancellaredel = item -> successivo; // elimina l'elemento dalla listaitem -> successivo = item -> successivo -> successivo; };

// recupera la memoria allocata per l'elemento eliminato dalla lista

free(del); // termina con esito positivoreturn(POS_RESULT);};

Con

tinu

a …

Page 25: C. Gaibisso Programmazione di Calcolatori Lezione XXII La struttura di dati lista di variabili strutturate Programmazione di Calcolatori: le liste di

C. Gaibisso Gestione di una lista di interi: file Gestione di una lista di interi: file ldi_ges.cldi_ges.c

Programmazione di Calcolatori: le liste di variabili strutturate 25

// Nome della funzione:// ldiCercaItem()// Tipo, nome e significato dei parametri della funzione:// ldi lista: riferimento al primo elemento della lista di interi// int valore: valore oggetto della ricerca// Descrizione della funzionalita' implementata:// verifica la presenza del valore nella lista di interi// Tipo e significato del valore restituito:// int: TRUE se esiste almeno un elemento che memorizza il valore; // FALSE altrimentiint ldiCercaItem (ldi lista, int valore)

{// se la lista e' vuota restituisce FALSEif (ldiEmpty(lista))

return(FALSE); // altrimenti scandisce la listawhile (lista != NULL)

// se l'elemento corrente memorizza il valore cercato, restituisce TRUE

if (lista -> valore == valore)return(TRUE);

else// altrimenti considera l'elemento successivo a quello

correntelista = lista -> successivo;

// se non individua il valore oggetto della ricerca restituisce FALSE

return(FALSE);};

Con

tinu

a …

Page 26: C. Gaibisso Programmazione di Calcolatori Lezione XXII La struttura di dati lista di variabili strutturate Programmazione di Calcolatori: le liste di

C. Gaibisso Gestione di una lista di interi: file Gestione di una lista di interi: file ldi_ges.cldi_ges.c

Programmazione di Calcolatori: le liste di variabili strutturate 26

// Nome della funzione:// ldiLung()// Tipo, nome e significato dei parametri della funzione:// ldi lista: riferimento al primo elemento della lista di interi// Descrizione della funzionalita' implementata:// calcola la lunghezza della lista// Tipo e significato del valore restituito:// int: la lunghezza della lista di interiint ldiLung (ldi lista)

{// definisce e inizializza la variabile per la lunghezza della listaint lunghezza = 0; // scandisce la lista aggiornando la lunghezza della lista// ad ogni elemento incontratowhile (lista != NULL)

{// aggiunge 1 alla lunghezza della listalunghezza ++; // considera l'elemento successivo a quello correntelista = lista -> successivo;};

// restituisce la lunghezza della listareturn(lunghezza);};

Con

tinu

a …

Page 27: C. Gaibisso Programmazione di Calcolatori Lezione XXII La struttura di dati lista di variabili strutturate Programmazione di Calcolatori: le liste di

C. Gaibisso Gestione di una lista di interi: file Gestione di una lista di interi: file ldi_ges.cldi_ges.c

Programmazione di Calcolatori: le liste di variabili strutturate 27

// Nome della funzione:// ldiReset()// Tipo, nome e significato dei parametri della funzione:// ldi *lista: riferimento al puntatore di accesso alla lista di interi// Descrizione della funzionalita' implementata:// azzera la lista recuperando tutta la memoria allocata per i// suoi elementi// Tipo e significato del valore restituito:// alcunovoid ldiReset (ldi *lista)

{// definisce un puntatore ad un elemento della lista struct ldi_item *item = *lista; // scandisce la listawhile (item != NULL)

{// stacca l'elemento corrente dalla testa della lista*lista = item -> successivo; // libera la memoria allocata per tale elementofree(item); // considera l’elemento successivo a quello correnteitem = *lista;};

};

Page 28: C. Gaibisso Programmazione di Calcolatori Lezione XXII La struttura di dati lista di variabili strutturate Programmazione di Calcolatori: le liste di

C. Gaibisso Gestione di una lista di interi: file Gestione di una lista di interi: file ldi_ges.hldi_ges.h

Programmazione di Calcolatori: le liste di variabili strutturate 28

// Nome e posizione del file:// Lezione_XXII/ldi_ges.h// Descrizione del contenuto del file:// contiene le dichiarazioni extern delle funzioni fondamentali// per la gestione di una lista di interiextern int ldiEmpty(ldi);extern int ldiIns(ldi *, int);extern void ldiVis(ldi);extern int ldiCancItem(ldi *, int);extern int ldiCercaItem (ldi, int);extern int ldiLung (ldi);extern void ldiReset (ldi *);

Page 29: C. Gaibisso Programmazione di Calcolatori Lezione XXII La struttura di dati lista di variabili strutturate Programmazione di Calcolatori: le liste di

C. Gaibisso Gestione di una lista di interi: file Gestione di una lista di interi: file ldi_uti.cldi_uti.c

Programmazione di Calcolatori: le liste di variabili strutturate 29

// Nome e posizione del file:// Lezione_XXII/ldi_uti.c// Descrizione del contenuto del file:// definizione delle utilities di supporto alle funzioni// per la gestione di una lista di interi// DEFINIZIONI DI TIPO// definizioni dei tipi, strutturati e non, per la gestione di una// lista di interi#include "./ldi_tipi.h"// DICHIARAZIONI EXTERN// inclusione del file di intestazione della libreria// standard che contiene definizioni di macro,// costanti e dichiarazioni di funzioni e tipi funzionali// alle varie operazioni di I/O#include <stdio.h>// inclusione del file di intestazione della libreria che contiene// definizioni di macro, costanti e dichiarazioni di funzioni e tipi// di interesse generale#include <stdlib.h>// dichiarazioni extern delle funzioni fondamentali// per la gestione di una lista di interi#include "ldi_ges.h"

Con

tinu

a …

Page 30: C. Gaibisso Programmazione di Calcolatori Lezione XXII La struttura di dati lista di variabili strutturate Programmazione di Calcolatori: le liste di

C. Gaibisso Gestione di una lista di interi: file Gestione di una lista di interi: file ldi_uti.cldi_uti.c

Programmazione di Calcolatori: le liste di variabili strutturate 30

// Nome della funzione:// ldiIni()// Tipo, nome e significato dei parametri della funzione:// ldi *lista: riferimento al puntatore di accesso alla lista di// interi// Descrizione della funzionalita' implementata:// inizializza la lista di interi a lista vuota// Tipo e significato del valore restituito:// alcunovoid ldiIni (ldi *lista)

{// inizializza la lista a lista vuota*lista = NULL;};

Con

tinu

a …

Page 31: C. Gaibisso Programmazione di Calcolatori Lezione XXII La struttura di dati lista di variabili strutturate Programmazione di Calcolatori: le liste di

C. Gaibisso Gestione di una lista di interi: file Gestione di una lista di interi: file ldi_uti.cldi_uti.c

Programmazione di Calcolatori: le liste di variabili strutturate 31

// Nome della funzione:// itemIni()// Tipo, nome e significato dei parametri della funzione:// int valore: intero memorizzato dal nuovo elemento// Descrizione della funzionalita' implementata:// alloca memoria e inizializza un nuovo elemento della lista// Tipo e significato del valore restituito:// struct ldi_item *: riferimento al nuovo elemento di una// lista di interi, se allocato con successo;// NULL altrimentistruct ldi_item *itemIni(int valore)

{// definisce un puntatore per il nuovo elemento della listastruct ldi_item *item;// alloca memoria per il nuovo elementoitem = (struct ldi_item *) malloc(sizeof(struct ldi_item));if (item != NULL) // se l’operazione ha esito positivo

{ // inizializza opportunamente i campi valore e successivoitem -> valore = valore; item -> successivo = NULL; };

// restituisce il riferimento al nuovo elemento, se allocato con successo,

// NULL altrimentireturn(item);};

Con

tinu

a …

Page 32: C. Gaibisso Programmazione di Calcolatori Lezione XXII La struttura di dati lista di variabili strutturate Programmazione di Calcolatori: le liste di

C. Gaibisso Gestione di una lista di interi: file Gestione di una lista di interi: file ldi_uti.cldi_uti.c

Programmazione di Calcolatori: le liste di variabili strutturate 32

// Nome della funzione:// ldiCercaCanc()// Tipo, nome e significato dei parametri della funzione:// ldi lista: riferimento al primo elemento di una lista di interi// int valore: intero oggetto della cancellazione// Descrizione della funzionalita' implementata:// individua, se esiste, l'elemento che memorizza il valore specificato, // se e‘ il primo della lista; // l'elemento a questo precedente, altrimenti.// Tipo e significato del valore restituito:// struct ldi_item *: il riferimento a tale elemento, se esiste;// NULL altrimentistruct ldi_item *ldiCercaCanc (ldi lista, int valore)

{// se la lista e' vuota restituisce NULLif (ldiEmpty(lista))

return(NULL);// se l'elemento da cancellare è il primo della lista restituisce il// riferimento all'elemento stessoif (lista -> valore == valore)

return(lista);

Con

tinu

a …

Page 33: C. Gaibisso Programmazione di Calcolatori Lezione XXII La struttura di dati lista di variabili strutturate Programmazione di Calcolatori: le liste di

C. Gaibisso Gestione di una lista di interi: file Gestione di una lista di interi: file ldi_uti.cldi_uti.c

Programmazione di Calcolatori: le liste di variabili strutturate 33

// altrimenti scandisce la listawhile (lista -> successivo != NULL)

// restituisce il riferimento all'elemento corrente, se l'elemento

// a questo successivo memorizza il valore cercato if (lista -> successivo -> valore == valore)

return(lista);else

// altrimenti passa a considerare l'elemento successivo a quello

// correntelista = lista -> successivo;

// restituisce NULL se non esiste alcun elemento all'interno// della lista che memorizza il valore cercato return(NULL);};

Page 34: C. Gaibisso Programmazione di Calcolatori Lezione XXII La struttura di dati lista di variabili strutturate Programmazione di Calcolatori: le liste di

C. Gaibisso Gestione di una lista di interi: file Gestione di una lista di interi: file ldi_uti.hldi_uti.h

Programmazione di Calcolatori: le liste di variabili strutturate 34

// Nome e posizione del file:// Lezione_XXII/ldi_uti.h// Descrizione del contenuto del file:// contiene le dichiarazioni extern delle utilities di supporto// alle funzioni per la gestione di una lista di interiextern void ldiIni(ldi *);extern struct ldi_item *itemIni(int);extern struct ldi_item *ldiCercaCanc (ldi, int);

Page 35: C. Gaibisso Programmazione di Calcolatori Lezione XXII La struttura di dati lista di variabili strutturate Programmazione di Calcolatori: le liste di

C. Gaibisso Gestione di una lista di interi: file Gestione di una lista di interi: file ldi_main.cldi_main.c

Programmazione di Calcolatori: le liste di variabili strutturate 35

// Nome e posizione del file:// Lezione_XXII/ldi_main.c// Descrizione del contenuto del file:// chiamante per la gestione di una lista di interi// PSEUDODICHIARAZIONI// pseudodichiarazioni per i messaggi restituiti nella gestione di una// lista di interi#include "./ldi_msg.h"// pseudodichiarazioni per le costanti simboliche// utilizzate nella gestione di una lista di interi#include "./ldi_const.h"// DEFINIZIONI DI TIPO// definizioni dei tipi, strutturati e non, per la gestione di una lista di interi#include "./ldi_tipi.h"// DICHIARAZIONI EXTERN// inclusione del file di intestazione della libreria// standard che contiene definizioni di macro,// costanti e dichiarazioni di funzioni e tipi funzionali// alle varie operazioni di I/O#include <stdio.h>// dichiarazioni extern delle utilities di supporto// alle funzioni per la gestione di una lista di interi#include "./ldi_uti.h"// dichiarazioni extern delle funzioni per la gestione di una lista di interi#include "./ldi_ges.h"

Con

tinu

a …

Page 36: C. Gaibisso Programmazione di Calcolatori Lezione XXII La struttura di dati lista di variabili strutturate Programmazione di Calcolatori: le liste di

C. Gaibisso Gestione di una lista di interi: file Gestione di una lista di interi: file ldi_main.cldi_main.c

Programmazione di Calcolatori: le liste di variabili strutturate 36

// Nome della funzione:// LdiMenu()// Tipo, nome e significato dei parametri della funzione:// ldi *lista: riferimento al puntatore di accesso alla lista di interi// Descrizione della funzionalita' implementata:// implementa il menu di scelta delle funzionalita' di gestione// di una lista di interi// Tipo e significato del valore restituito:// alcunovoid ldiMenu(ldi *lista)

{// definisce e inizializza la variabile// che permette l'uscita dal programmaint quit = 0; // definisce la variabile per il valore oggetto delle// operazioni di inserimento, cancellazione e ricercaint valore;

Con

tinu

a …

Page 37: C. Gaibisso Programmazione di Calcolatori Lezione XXII La struttura di dati lista di variabili strutturate Programmazione di Calcolatori: le liste di

C. Gaibisso Gestione di una lista di interi: file Gestione di una lista di interi: file ldi_main.cldi_main.c

Programmazione di Calcolatori: le liste di variabili strutturate 37

// rimane nel ciclo finche' la variabile quit rimane uguale a 0

while(!quit){// definisce la variabile che memorizza la selezione int selezione; // visualizza le possibili scelteprintf(SELECT_FUN_LOI);printf(ADD_ITEM_LOI);printf(DEL_ITEM_LOI);printf(SEARCH_ITEM_LOI);printf(LENGTH_OF_LOI);printf(RESET_LOI);printf(DISPLAY_LOI);printf(EMPTY_LOI_TEST);printf(LEAVE_MAN_LOI);printf(SELECT_OP_LOI); // acquisisce la sceltascanf("%d", &selezione);

Con

tinu

a …

Page 38: C. Gaibisso Programmazione di Calcolatori Lezione XXII La struttura di dati lista di variabili strutturate Programmazione di Calcolatori: le liste di

C. Gaibisso Gestione di una lista di interi: file Gestione di una lista di interi: file ldi_main.cldi_main.c

Programmazione di Calcolatori: le liste di variabili strutturate 38

// discrimina tra le diverse scelteswitch (selezione)

{case 1: // inserimento di un nuovo elemento

// acquisisce il valore oggetto dell'inserimentoprintf(ITEM_VALUE_REQ);scanf("%d", &valore); // chiama la funzione per l’inserimento di un

nuovo // elemento nella lista, testa l'esito

dell'operazione e // lo visualizza if (ldiIns(lista, valore) == POS_RESULT)

printf(POS_RES_MSG);else

{printf(NEG_RES_MSG);printf(ITEM_GEN_FAILED);};

break;

Con

tinu

a …

Page 39: C. Gaibisso Programmazione di Calcolatori Lezione XXII La struttura di dati lista di variabili strutturate Programmazione di Calcolatori: le liste di

C. Gaibisso Gestione di una lista di interi: file Gestione di una lista di interi: file ldi_main.cldi_main.c

Programmazione di Calcolatori: le liste di variabili strutturate 39

case 2: // cancellazione di un elemento// acquisisce il valore oggetto della

cancellazioneprintf(ITEM_VALUE_REQ);scanf("%d", &valore); // chiama la funzione per la cancellazione del

primo // elemento della lista che memorizza il valore,

testa // l'esito dell'operazione e lo visualizzaif (ldiCancItem(lista, valore) == POS_RESULT)

printf(POS_RES_MSG);else

{printf(NEG_RES_MSG);printf(ITEM_DEL_FAILED);};

break;

Con

tinu

a …

Page 40: C. Gaibisso Programmazione di Calcolatori Lezione XXII La struttura di dati lista di variabili strutturate Programmazione di Calcolatori: le liste di

C. Gaibisso Gestione di una lista di interi: file Gestione di una lista di interi: file ldi_main.cldi_main.c

Programmazione di Calcolatori: le liste di variabili strutturate 40

case 3: // ricerca di un elemento// acquisisce il valore oggetto della ricercaprintf(ITEM_VALUE_REQ);scanf("%d", &valore);// chiama la funzione per la ricerca del valore

nella lista, // testa l'esito dell'operazione e lo visualizzaif (ldiCercaItem(*lista, valore))

printf(ITEM_SEARCH_SUCC);else

printf(ITEM_SEARCH_FAIL);break;

case 4: // lunghezza della lista // chiama la funzione per il calcolo della lunghezza della // lista e la visualizza printf(LOI_LENGTH); printf("%d", ldiLung(*lista)); break; case 5: // reset della lista // chiama la funziona che azzera la lista

ldiReset(lista);break;

Con

tinu

a …

Page 41: C. Gaibisso Programmazione di Calcolatori Lezione XXII La struttura di dati lista di variabili strutturate Programmazione di Calcolatori: le liste di

C. Gaibisso Gestione di una lista di interi: file Gestione di una lista di interi: file ldi_main.cldi_main.c

Programmazione di Calcolatori: le liste di variabili strutturate 41

case 6: // visualizzazione della lista// chiama la funzione per la visualizzazione

della listaldiVis(*lista);

break;case 7: // test di lista vuota

// chiama la funzione per il test di lista vuota e// visualizza il risultatoif (ldiEmpty(*lista))

printf(EMPTY_LOI);else

printf(NOT_EMPTY_LOI);break;

case 8: // uscita// forza l’uscita dal sistemaquit = 1;

break;default: // selezione errata

// segnala un errore di selezione delle funzionalità

printf(WRONG_SELECTION);};

};};

Con

tinu

a …

Page 42: C. Gaibisso Programmazione di Calcolatori Lezione XXII La struttura di dati lista di variabili strutturate Programmazione di Calcolatori: le liste di

C. Gaibisso Gestione di una lista di interi: file Gestione di una lista di interi: file ldi_main.cldi_main.c

Programmazione di Calcolatori: le liste di variabili strutturate 42

// Nome della funzione:// main()// Tipo, nome e significato dei parametri della funzione:// alcuno// Descrizione della funzionalita' implementata:// chiamante// Tipo e significato del valore restituito:// alcunoint main()

{// definisce il puntatore di accesso alla lista di

interi;ldi lista;// inizializza la listaldiIni(&lista); // chiama la funzione che implementa il menu

di scelta// delle funzionalita' di gestione della lista di

interildiMenu(&lista);

// recupera la memoria allocata per la lista ldiReset(&lista);

return(0);};

Page 43: C. Gaibisso Programmazione di Calcolatori Lezione XXII La struttura di dati lista di variabili strutturate Programmazione di Calcolatori: le liste di

C. Gaibisso Gestione di una lista di interi: file Gestione di una lista di interi: file ldi_const.hldi_const.h

Programmazione di Calcolatori: le liste di variabili strutturate 43

// Nome e posizione del file:// Lezione_XXII/ldi_const.h// Descrizione del contenuto del file:// contiene le pseudodichiarazioni per le costanti simboliche// utilizzate nella gestione di una lista di interi// definizione delle costanti simboliche per gli esiti di una operazione#define NEG_RESULT 0#define POS_RESULT 1// definizione delle costanti mnemoniche per gli esiti di un test#define TRUE 1#define FALSE 0

Page 44: C. Gaibisso Programmazione di Calcolatori Lezione XXII La struttura di dati lista di variabili strutturate Programmazione di Calcolatori: le liste di

C. Gaibisso Gestione di una lista di interi: file Gestione di una lista di interi: file ldi_msg.hldi_msg.h

Programmazione di Calcolatori: le liste di variabili strutturate 44

// Nome e posizione del file:// Lezione_XXII/ldi_msg.h// Descrizione del contenuto del file:// contiene le pseudodichiarazioni per i messaggi// restituiti nella gestione di una lista di interi// definizione delle costanti simboliche per i messaggi utilizzati per il menu#define SELECT_FUN_LOI "\nSelezionare Funzionalita'\n"#define ADD_ITEM_LOI "\n1: Aggiungi un intero"#define DEL_ITEM_LOI "\n2: Cancella un intero"#define SEARCH_ITEM_LOI "\n3: Ricerca un intero"#define LENGTH_OF_LOI "\n4: Lunghezza della lista"#define RESET_LOI "\n5: Azzera la lista"#define DISPLAY_LOI "\n6: Visualizza la lista"#define EMPTY_LOI_TEST "\n7: Test di lista vuota"#define LEAVE_MAN_LOI "\n8: Interrompi"#define SELECT_OP_LOI "\n\nSelezione: "#define WRONG_SELECTION "\nSelezionare 1, 2, 3, 4, 5, 6, 7 o 8" C

on

tinu

a …

Page 45: C. Gaibisso Programmazione di Calcolatori Lezione XXII La struttura di dati lista di variabili strutturate Programmazione di Calcolatori: le liste di

C. Gaibisso Gestione di una lista di interi: file Gestione di una lista di interi: file ldi_msg.hldi_msg.h

Programmazione di Calcolatori: le liste di variabili strutturate 45

// definizione delle costanti simboliche per i messaggi di descrizione per l'esito// delle operazioni#define ITEM_GEN_FAILED "\nGenerazione del nuovo elemento fallita"#define ITEM_DEL_FAILED "\nCancellazione dell'elemento fallita: elemento non presente"#define ITEM_SEARCH_SUCC "\nEsito della ricerca positivo\n"#define ITEM_SEARCH_FAIL "\nEsito della ricerca negativo\n"#define LOI_LENGTH "\nLunghezza della lista: "// definizione delle costanti simboliche per i messaggi descrittivi della lista#define EMPTY_LOI "\nLista vuota\n"#define NOT_EMPTY_LOI "\nLista non vuota\n"#define LIST "\nLista: "// definizione delle costanti simboliche per messaggi per l'esito delle operazioni#define NEG_RES_MSG "\nOperazione fallita\n"#define POS_RES_MSG "\nOperazione terminata con successo\n“// definizione delle costanti simboliche per i messaggi di acquisizione di dati#define ITEM_VALUE_REQ "\nValore elemento? "

Page 46: C. Gaibisso Programmazione di Calcolatori Lezione XXII La struttura di dati lista di variabili strutturate Programmazione di Calcolatori: le liste di

C. Gaibisso

Grafo delle chiamateGrafo delle chiamate

Programmazione di Calcolatori: i tipi di dato astratto 46

• Obiettivo:

descrivere (graficamente) l’interazione reciproca tra le funzioni

•Cos’è:•un grafo nel quale ogni nodo identifica una funzione e il file che la contiene

•esiste un arco orientato dal nodo per la funzione f(.) a quello per la funzione g(.) se e solo se f(.) chiama g(.)

Page 47: C. Gaibisso Programmazione di Calcolatori Lezione XXII La struttura di dati lista di variabili strutturate Programmazione di Calcolatori: le liste di

C. Gaibisso Gestione di una lista di Gestione di una lista di interiinteri

Programmazione di Calcolatori: i tipi di dato astratto 47

• Grafo delle chiamate:

main()./ldi_main.c

ldiMenu()./ldi_main.c

ldiIni()./ldi_uti.c

ldiVis()./ldi_ges.c

ldiIns()./ldi_ges.c

itemIni()./ldi_uti.c

ldiEmpty()./ldi_ges.c

ldiCancItem()

./ldi_ges.c

ldiCercaCanc()

./ldi_uti.c

ldiCercaItem()

./ldi_ges.c

ldiLung()./ldi_ges.c

ldiReset()./ldi_ges.c