Strutture Dati - Dipartimento di Informatica

Strutture Dati
Elisa Marengo
Università degli Studi di Torino
Dipartimento di Informatica
Elisa Marengo (UNITO)
Strutture Dati
1 / 16
Introduzione
Fino ad ora nei nostri programmi abbiamo usato
Variabili;
Array (a una o più dimensioni).
Gli Array
sono utili per memorizzare tanti elementi tutti dello stesso tipo
Ma a volte vorrei poter memorizzare elementi differenti ed
eventualmente di tipo differente.
Elisa Marengo (UNITO)
Strutture Dati
2 / 16
Introduzione
Fino ad ora nei nostri programmi abbiamo usato
Variabili;
Array (a una o più dimensioni).
Gli Array
sono utili per memorizzare tanti elementi tutti dello stesso tipo
Ma a volte vorrei poter memorizzare elementi differenti ed
eventualmente di tipo differente.
Elisa Marengo (UNITO)
Strutture Dati
2 / 16
Esempio
Immaginiamo di voler memorizzare dei punti da disegnare su un asse
cartesiano
Per ognuno vogliamo memorizzare la coordinata x e la coordinata y.
Con gli elementi che conosciamo fino ad ora, quale rappresentazione potrei
usare?
Potrei usare un array di dimensione pari al numero di punti che voglio
memorizzare.
Di che tipo sono gli elementi che compongono l’array?
Per ogni elemento io vorrei rappresentare due valori (le due
coordinate).
Elisa Marengo (UNITO)
Strutture Dati
3 / 16
Esempio
Immaginiamo di voler memorizzare dei punti da disegnare su un asse
cartesiano
Per ognuno vogliamo memorizzare la coordinata x e la coordinata y.
Con gli elementi che conosciamo fino ad ora, quale rappresentazione potrei
usare?
Potrei usare un array di dimensione pari al numero di punti che voglio
memorizzare.
Di che tipo sono gli elementi che compongono l’array?
Per ogni elemento io vorrei rappresentare due valori (le due
coordinate).
Elisa Marengo (UNITO)
Strutture Dati
3 / 16
Le strutture dati
Un struttura dati
Raggruppa un insieme di variabili a cui si fa riferimento con un unico
nome.
Le variabili della struttura sono chiamate membri (o elementi o
campi).
I membri di una struttura possono essere di tipi differenti e di
lunghezza differente.
I membri di una struttura sono generalmente logicamente correlati tra
loro.
Elisa Marengo (UNITO)
Strutture Dati
4 / 16
Dichiarazione di una struttura dati
struct nome - struttura {
tipo nome - membro ;
tipo nome - membro ;
.
.
} variabili - struttura ;
nome - struttura variabile ;
struct: parola chiave per indicare
che stiamo definendo una
struttura
nome-struttura: nome che noi
diamo alla struttura. Sarà lo
specificatore di tipo per questa
struttura.
variabili-struttura: dichiarazione di
una o più variabili di tipo
nome-struttura.
Una struttura
Sostanzialmente definisce un tipo di dati complesso.
Elisa Marengo (UNITO)
Strutture Dati
5 / 16
Dichiarazione di una struttura dati
struct nome - struttura {
tipo nome - membro ;
tipo nome - membro ;
.
.
} variabili - struttura ;
nome - struttura variabile ;
struct: parola chiave per indicare
che stiamo definendo una
struttura
nome-struttura: nome che noi
diamo alla struttura. Sarà lo
specificatore di tipo per questa
struttura.
variabili-struttura: dichiarazione di
una o più variabili di tipo
nome-struttura.
Una struttura
Sostanzialmente definisce un tipo di dati complesso.
Elisa Marengo (UNITO)
Strutture Dati
5 / 16
Esempio 1
struct punto {
int x ;
int y ;
};
punto mio - punto ;
Elisa Marengo (UNITO)
Strutture Dati
6 / 16
Esempio 2
struct prodotto {
int peso ;
float prezzo ;
};
prodotto mela ;
prodotto banana , melone ;
Elisa Marengo (UNITO)
Strutture Dati
7 / 16
Esempio 2 - Alternativa
struct prodotto {
int peso ;
float prezzo ;
} mela , banana , melone ;
Elisa Marengo (UNITO)
Strutture Dati
8 / 16
Accesso ai membri delle strutture
Quando si dichiara una variabile di tipo della struttura il compilatore
alloca automaticamente la quantità di memoria per contenere tutti
membri della struttura.
Per accedere ai membri della struttura si usa l’operatore punto ‘.’
variabile - struttura . nome - membro ;
Elisa Marengo (UNITO)
Strutture Dati
9 / 16
Esempio
prodotto mela ;
mela . peso = 500;
mela . prezzo = 2;
prodotto . banana ;
banana . peso = 200;
banana . prezzo = 2.5;
Qual è il tipo di mela.prezzo?
Elisa Marengo (UNITO)
Strutture Dati
10 / 16
Esempio
prodotto mela ;
mela . peso = 500;
mela . prezzo = 2;
prodotto . banana ;
banana . peso = 200;
banana . prezzo = 2.5;
Qual è il tipo di mela.prezzo?
Elisa Marengo (UNITO)
Strutture Dati
10 / 16
Esempio
punto mio - punto ;
mio - punto . x =2;
mio - punto . y =1;
punto mieipunti [3];
for ( int i =0; i <3; i ++){
mieipunti [ i ]. x = i ;
mieipunti [ i ]. y = i +2;
}
Elisa Marengo (UNITO)
Strutture Dati
11 / 16
Puntatori a strutture dati
Cosı̀ come per gli altri tipi, anche per le strutture dati è possibile dichiarare
puntatori ed operare tramite essi
prodotto mela ;
prodotto * pmela = & mela ;
prodotto * p = new prodotto ;
Elisa Marengo (UNITO)
Strutture Dati
12 / 16
Puntatori a strutture dati
Cosı̀ come per gli altri tipi, anche per le strutture dati è possibile dichiarare
puntatori ed operare tramite essi
prodotto mela ;
prodotto * pmela = & mela ;
prodotto * p = new prodotto ;
Ovviamente, è possibile accedere ai campi della struttura attraverso i
puntatori
(* pmela ). peso ;
Attenzione!
*pmela.peso equivale a *(pmela.peso)
Elisa Marengo (UNITO)
Strutture Dati
13 / 16
L’operatore Freccia ->
L’operatore -> viene usato per accedere ad un membro di una struttura
tramite un puntatore. Le seguenti espressioni sono equivalenti
(* pmela ). peso ;
pmela - > peso ;
Elisa Marengo (UNITO)
Strutture Dati
14 / 16
Passaggio di strutture alle funzioni
Quando una struttura viene passata come parametro, l’intera struttura
viene passata per valore
Ogni modifica apportata dalla funzione non modifica la struttura
usata come argomento;
La dichiarazione del tipo della struttura deve essere globale, in modo
che sia accessibile in ogni parte del programma;
Non bisogna sottovalutare il sovraccarico che chiamate per valore
possono comportare:
Viene creata una copia per ogni elemento della struttura, anche per gli
array, su cui poi la funzione opera
Elisa Marengo (UNITO)
Strutture Dati
15 / 16
Passaggio di un puntatore a struttura
L’alternativa consiste nel passare un puntatore alla struttura come
parametro alla funzione.
La dichiarazione di tipo della struttura deve ancora essere globale;
In memoria viene copiato solo il riferimento.
struct punto {
int x ;
int y ;
};
main (){
punto miopunto ;
miopunto . x =2;
miopunto . y =3;
void incrementa ( punto * p ){
p - > x ++;
p - > y ++;
}
Elisa Marengo (UNITO)
incrementa (& miopunto );
}
Strutture Dati
16 / 16