You are on page 1of 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

You might also like