Sei sulla pagina 1di 29

Universit di Napoli Federico II - Dip.

di Ingegneria Elettrica e delle Tecnologie dellInformazione


Corso di Laurea in Ingegneria Informatica

Corso di Programmazione I

Contenitori
Contenitori
 In quasi tutti i casi reali necessario creare e
operare su collezione di elementi
 Una classe il cui obiettivo principale fornire una
astrazione di una collezione di elementi detta
contenitore
 La libreria standard del C++ offre molte classi
contenitore
 Due dei contenitori fondamentali sono il tipo
vettore (vector) e il tipo lista (list) che vengono
utilizzati anche per costruire altri contenitori
Contenitori trattati in questo corso
Collezioni (o elenchi) lineari di singoli elementi, rappresentate
mediante:

Vettore
Rappresentazione statica o dinamica con array monodimensionale
Lista
Rappresentazione con lista dinamica a puntatori (a concatenazione singola)

Pila
Rappresentazione mediante vettore
Rappresentazione con lista dinamica a puntatori
Coda
Rappresentazione mediante vettore
Rappresentazione con lista dinamica a puntatori
Contenitori
 I contenitori possono essere classificati in base
alla politica di gestione degli elementi (strategia di
accesso agli elementi):
 Nessuna
 Ordinata
 FIFO (First In First Out)  CODA
 LIFO (Last In First Out)  PILA

Esempio di progettazione
LISTA ORDINATA
nome domini semantica notazione
operazioni
Start L Inizializza la lista: Start(l)
produce lista vuota

Inserisci LxEL Inserisce un elemento Inserisci(l,e)


secondo lordine
definito
Elimina LxEL Estrae un elemento Elimina(l,e)
Stampa L Stampa la lista Stampa(l)
completa
predicati
Empty Lbooleano La lista vuota Empty(l)
Full Lbooleano La lista piena Full(l)
InList LxEbooleano Lelemento presente Inlist(l,e)
nella lista
Rappresentazione con array
Struttura dati:
Array monodimensionale + variabile di tipo intero che
mantiene il numero corrente degli elementi nella lista
La sequenza degli elementi data dalla posizione
stessa degli elementi dellarray: lordinamento logico
corrisponde con lordinamento fisico

0 1 N-1

nelem
Rappresentazione con array

In questo caso la definizione del tipo mediante Record


potrebbe essere:

struct Record {
E v[N];
int nelem;
};
Rappresentazione con array

Collezione non ordinata. Operazioni:


Inizializzazione (nelem=0)
Inserimento in testa (push)
Inserimento in coda
Ricerca sequenziale
Eliminazione in testa (pop)
Eliminazione di un elemento dato
Analisi dellelemento di testa (top)
Calcolo dei predicati empty e full (nelem==0/nelem==N)
Rappresentazione con array

Collezione ordinata
Le operazioni devono garantire lordinamento
La gestione onerosa perch richiede lo spostamento
fisico degli elementi in caso di inserimento e
eliminazione
ADT Pila

PILA: elenco di elementi con politica di gestione LIFO:


Last In First Out. Operazioni:
Start
Push
Pop
Top
Empty
Full
La struttura dati prevede un indice-puntatore alla testa
della pila
ADT Pila: rappresentazione con array
Start
t=0;
Push
p[t]=e; N-1
t++;
Pop
t--;
e=p[t]; t (punta al primo vuoto)
y
Top
e=p[t-1]; 0 x
Empty
t==0;
Full
t==N;
ADT Coda
CODA: elenco di elementi con politica di gestione FIFO
(First In First Out). Operazioni:
Start
Append
Pop
Empty
Full
La struttura dati prevede una variabile contenente il
numero degli elementi in coda e sia un indice-puntatore
alla testa che un indice-puntatore alla coda
Una variante molto utilizzata la coda circolare
ADT Coda: rappresentazione con array

Linserimento avviene in coda


Il prelievo avviene in testa
0 y t
x
z c

N-1 nelem
ADT Coda: rappresentazione con array
(coda circolare)
Start Pop
nelem=0; e=q[t];
t=c=0; t=(t+1)%N;
Append nelem--;
q[c]=e; Empty
c=(c+1)%N; nelem==0;
nelem++; Full
nelem==N;
Lincremento degli indici-puntatori effettuato
modulo N
Rappresentazione con lista dinamica a
puntatori

Collezione non ordinata. Operazioni:


Inizializzazione (l=0)
Inserimento in testa (push)
Inserimento in coda
Ricerca sequenziale
Eliminazione in testa (pop)
Eliminazione di un elemento dato
Analisi dellelemento di testa (top)
Calcolo dei predicati empty e full (l==0/FALSE)
Rappresentazione con lista dinamica a
puntatori

Struttura dati
Richiede la dichiarazione di un tipo Record
costituita da un puntatore al tipo Record che
rappresenta la testa della lista
Gli elementi della lista vengono allocati
dinamicamente

l
Rappresentazione con lista dinamica a
puntatori

In questo caso la definizione del tipo mediante Record


potrebbe essere:

typedef Record* PRec;


struct Record {
E elem;
PRec succ;
};
Collegamento tra due elementi di tipo
Record

01011001 01011010

5 01011010 6 01011011

Il campo puntatore del record deve contenere


lindirizzo di memoria del record sussessivo
nella lista
Il Record

E logicamente costituito da due campi:


Un campo che rappresenta il contenuto informativo
(pu essere di tipo atomico o a sua volta un tipo
strutturato)
Un campo di tipo puntatore che serve a creare il
collegamento tra un elemento della lista ed il prossimo
elemento
Esempio

typedef int E;
struct Record; //pre-dichiarazione del tipo Record

typedef Record* L;

struct Record {
E elem; // campo informazione
L punt; // campo puntatore
};
Operazioni su lista dinamica a
puntatori

Inserimento in testa

1) q->next=l
q=new Record
2) l=q
q


l
Operazioni su lista dinamica a
puntatori

Inserimento di un elemento interno alla lista

q=new Record q
1) q->next=succ
2) prec->next=q

prec succ
Operazioni su lista dinamica a
puntatori

Inserimento in coda

q=new Record q
0
temp->next=q

temp
Operazioni su lista dinamica a
puntatori
Eliminazione in testa

1) Record * temp=l
2) l=l->next
3) delete temp

l
Operazioni su lista dinamica a
puntatori
Eliminazione di un elemento interno alla lista
1) Record * temp=temp1->next
2) temp1->next=temp1->next->next
3) delete temp

temp1
Operazioni su lista dinamica a
puntatori

Eliminazione di un elemento in coda

temp1
1) Record * temp=temp1->next
2) temp1->next=0
3) delete temp
Rappresentazione con lista dinamica a
puntatori

Lista ordinata
Le operazioni devono garantire lordinamento
La gestione molto vantaggiosa rispetto alla
soluzione precedente perch non richiede lo
spostamento fisico degli elementi in caso di
inserimento e eliminazione
Lista linkata: vantaggi

La gestione di una lista linkata molto vantaggiosa


rispetto alla rappresentazione tramite array perch
non richiede lo spostamento fisico degli elementi in
caso di inserimento e eliminazione
In generale un ulteriore vantaggio dato dalla
occupazione di memoria commisurata alleffettiva
necessit e alla possibilit di rilasciare le aree non pi
utilizzate in seguito alla cancellazione di un elemento
Rappresentazione degli ADT Pila e Coda
con lista dinamica a puntatori

Simile a quanto gi visto:


La struttura dati della Pila prevede un puntatore alla
testa
La struttura dati della Coda prevede un puntatore
alla testa ed uno alla coda
avere a disposizione entrambi i puntatori, sebbene non
indispensabile, migliora lefficienza di alcune operazioni ed
praticamente una scelta sempre adottata
ci migliora, per esempio, linserimento in coda poich non
necessario scorrere tutta la struttura