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