Strutture dati
1
Astrazione

Non vogliamo sapere l’organizzazione
fisica dei dati
 indirizzi

e celle di memoria
Ci interessa solo la loro organizzazione
astratta
2
Strutture statiche e dinamiche




Statica: che non cambia nel tempo (forma o
dimensione)
Es.: elenco di nomi: posso aggiungere o
eliminare nomi?
Struttura statica: solo metodi per accedere ai
dati e per modificarli
Struttura dinamica: anche metodi per
aggiungere e togliere dati, e trovare spazio in
memoria per i nuovi dati
3
Puntatori





Ogni cella di memoria ha un indirizzo
Indirizzo = valore numerico  puo’ essere
memorizzato in una cella di memoria
Puntatore: cella/e di memoria che contiene
l’indirizzo di un’altra cella di memoria
Puo’ servire a sapere dove sono stati
memorizzati dei dati
Es.: registro contatore programma della CPU
4
Puntatori come tipi di dati



In molti linguaggi di programmazione
Dichiarazione, allocazione, gestione dei
puntatori (come un real o un integer)
Es.: in memoria c’e’ una lista di romanzi (per
ordine alfabetico del titolo)
trovare tutti i romanzi di un certo autore 
aggiungo una cella ad ogni romanzo, che contiene il
puntatore al romanzo successivo dello stesso autore,
in un ciclo
 Vogliamo
5
Esempio
6
Array omogeneo
Viene memorizzato in memoria in celle
contingue
 Facile trovare l’elemento i:
 Vado all’indirizzo di inizio dell’array, x
 Vado all’indirizzo x + (i-1)*k celle, dove
k=numero di celle per un elemento
dell’array

7
Esempio
8
Array bidimensionale
Esempio: tabella con venditori sulle righe
e giorni della settimana sulle colonne:
numero di vendite in ogni cella  array
bidimensionale
 Una riga: vendite di un venditore in una
settimana
 Una colonna: vendite fatte in un giorno da
tutti i venditori

9
Simulazione di tabella in memoria
Memoria: sequenza di celle con indirizzi
consecutivi
 Un array e’ statico  posso riservare un
pezzo di memoria per l’intero array, e poi
metterci l’array riga per riga

10
Esempio




Come trovare il valore in terza riga e quarta
colonna?
Da prima cella, passiamo la prima riga e la
seconda
Cinque elementi per riga  10 elementi pr
arrivare al primo elemento della terza riga
Altri 3 elementi per quarto elemento della terza
riga  13 elementi in totale
11
In generale ...





Array con c colonne, x indirizzo iniziale
Indirizzo di elemento in riga i e colonna j:
x + (c * (i-1)) + (j-1)
Il compilatore traduce i riferimenti (es.
Vendite[2,4]) in indirizzi di memoria
Il programmatore usa la forma tabulare (struttura
astratta), il compilatore usa la memorizzazione
in memoria (struttura fisica)
12
Esercizio





Array bidimensionale con 8 righe e 11 colonne
Ogni elemento occupa 2 celle di memoria
Memorizzato per righe a partire dall’indirizzo 25
Indirizzo dell’elemento in terza riga e sesta
colonna?
25 + (11x2x2) + (2x5) = 25+44+10=79
13
Liste
Sequenza di elementi, dinamica
 Es.: lista di nomi, ogni nome 8 lettere  8
celle di memoria
 Come la memorizzo in memoria? Blocco
di celle consecutive (80)?

14
Liste contigue
Devo cancellare un nome  spazio vuoto
 devo spostare tutti i nomi che seguono
(ordine alfabetico)
 Devo inserire un nuovo nome  non c’e’
spazio  devo spostare tutto il blocco

15
Lista concatenata





Gli elementi sono memorizzati in aree di
memoria diverse invece che contigue
Nell’esempio, 9 celle per ogni nome: 8 per il
nome, 1 per puntatore all’elemento successivo
Inoltre, puntatore al primo elemento (testa) della
lista
Puntatore speciale (nil) nell’ultimo elemento
Per accedere all’elemento i-esimo: devo
scorrere tutti gli elementi dal primo all’i-esimo
16
Lista concatenata
17
Cancellazione in liste concatenate

Modifico il puntatore che punta
all’elemento da cancellare, e lo faccio
puntare all’elemento successivo
18
Inserzione in liste concatenate
Trovo un blocco di 9 celle “libero”, dove
metto il nome e il puntatore all’elemento
che lo seguira’ nella lista
 Cambio il puntatore di chi lo precedera’
per farlo puntare a lui

19
Code e pile



coda
pila
Le liste concatenate riducono gli spostamenti se
permettiamo inserzioni e cancellazioni ovunque
Se permettiamo modifiche solo alle estremita’,
anche una struttura contigua puo’ andare bene
Pila (stack): inserzioni (push) e cancellazioni
(pop) solo ad una estremita’ (cima)  l’ultimo
elemento inserito e’ il primo ad essere cancellato
(LIFO)
20
Memorizzazione di una pila
Blocco di celle contigue, grande
abbastanza per le inserzioni previste
 Puntatore alla cima dello stack (ultimo
elemento riempito)

21
Pila per chiamate di procedura




Quando un programma chiama una procedura,
deve memorizzare da qualche parte l’indirizzo di
ritorno (da cui riprendere l’esecuzione dopo)
Dove lo memorizza? In una pila
Chiamata dopo chiamata, gli indirizzi vengono
memorizzati sulla pila
Alla chiusura delle procedure, gli indirizzi di
ritorno vengono presi in ordine opposto
22
Pila per chiamate di procedura
23
Pila per ordine inverso




Vogliamo stampare gli elementi di una lista
concatenata in ordine inverso
Ci serve una struttura dati per memorizzare ogni
nome finche’ i nomi seguenti non sono stati
stampati
Scorro la lista e metto i nomi su una pila
Alla fine della lista, stampo i nomi della pila
24
25
26
Esercizi e domande
Un programma chiama la procedura A,
che chiama la B. Quando B termina, A
chiama la procedura C.
 Seguire questo percorso mantenendo
aggiornata la pila delle posizioni di ritorno.

27
Coda





Tutti gli inserimenti ad una estremita’ (coda)
Tutte le cancellazioni all’altra estremita’ (testa)
FIFO
Memorizzazione:
 celle contigue
 due puntatori
 alla testa: primo elemento
 alla coda: primo elemento libero
Coda “circolare”: quando gli elementi
ragiungono la fine del blocco, inserisco dall’altra
estremita’
28
Code
29
Code
30
Code circolari
31
Code circolari
32
Esercizio


Inserire gli indirizzi
nelle celle vuote in
modo che ogni cella
con una lettera, piu’
la cella successiva,
formi un elemento di
una lista
concatenata in cui le
lettere appaiono in
ordine alfabetico
Che indirizzo per
testa lista?
Indirizzo
11
12
13
14
15
16
17
18
19
20
21
22
Contenuto
C
G
E
B
U
F
33
Esercizio




Lista concatenata
Un elemento: due
celle (lettera +
indirizzo elemento
successivo)
Modificare i
puntatori per
eliminare N
Sostituire N con G e
modificare puntatori
in modo che G sia in
ordine alfabetico
Indirizzo
30
31
32
33
34
35
36
37
38
39
40
41
Contenuto
J
38
B
30
X
46
N
40
K
36
P
34
34
Esercizio



Puntatore alla testa:
34
Che nome e’
contenuto nella
lista?
Modificare puntatori
per avere il nome
Jean
Indirizzo
30
31
32
33
34
35
36
37
38
39
40
41
Contenuto
N
36
I
30
J
40
E
00
M
32
A
30
35
Esercizio
Coda
 Ogni elemento occupa una cella di
memoria
 Puntatore alla testa = 11
 Puntatore alla coda = 17
 Quali soni i valori dei due puntatori dopo
aver inserito un elemento e eliminati due?

36
Scarica

Strutture dati