Per scaricare il file sorgente di questo esercizio clicca qui
Per scaricare il file eseguibile di questo esercizio clicca qui
Questo programma è dedicato alle liste. Una lista è una particolare struttura (vedi esercizio6). I legami tra i componenti di una lista sono definiti dai puntatori contenuti negli elementi stessi. Ciò le distingue dagli array, nei quali i legami tra i dati risultano dalla disposizione in memoria. Ma vediamo di fare più chiarezza, ogni elemento di una lista è contenuto in una struttura. Questa struttura comprende il contenuto informativo vero e proprio dell' elemento: variabili, array e in fine un puntatore. Questo puntatore funge da legame con gli altri elementi.
La struttura contiene un puntatore al tipo elemento, cioè un' altra struttura dello stesso tipo. Dunque ogni struttura di tipo "elemento" non solo contiene dati, ma può puntare ad un' altra struttura analoga. La rappresentazione grafica di un elemento della lista è la seguente:
mentre quella di una lista risulta essere come segue:
Come si vede ogni struttura punta alla successiva tranne l'ultima che non punta a nulla. Infatti l'ultimo elemento di una lista si distingue perché il suo puntatore ha valore NULL. Il puntatore del primo elemento è chiamato puntatore di testa. Se questo punta a NULL significa che la lista è vuota, altrimenti la lista contiene già uno o più elementi. Nel nostro programmino sono state create due funzioni, una per aggiungere un elemento alla lista e una per visualizzare gli elementi della lista. Di seguito i prototipi di tali finzioni.
Analizziamo la funzione che ci consente di inserire un elemento in una lista.
Gli argomenti della funzione sono un puntatore ad una struttura di tipo elemento e una variabile di tipo intero. Viene inizialmente dichiarato un puntatore punt a una struttura di tipo elemento (questo puntatore è locale). Nel corpo della funzione un costrutto if-else divide la funzione in due parti, la prima aggiunge una lista nel caso ci siamo già altri elementi presenti, mentre la seconda parte entra in azione se la lista è vuota, creando il primo elemento della lista. Partiamo ad analizzare proprio questa seconda parte:
Il puntatore p passato alla funzione avrà valore NULL, in quanto la lista è ancora vuota. Con la funzione malloc() vista nell' esercizio8, viene allocata un' area di memoria tanto grande quanto basta per memorizzare la struttura di tipo elemento, sizeof (struct elemento), e restituisce un puntatore a questa area di memoria assegnato proprio al puntatore p. Vengono poi assegnati dei valori agli elementi della struttura puntata dal puntatore p. Ovvero viene assegnato un valore alla variabile inf (valore da noi inserito durante la chiamata a funzione), e viene assegnato NULL al puntatore pun all'interno della struttura. Al puntatore locale punt viene assegnato p. La funzione termina restituendo proprio punt. Al termine di questa apparentemente complicata procedura avremo quindi un puntatore al primo elemento della nostra lista (il punt restituito dalla funzione), mentre il puntatore all' interno del primo elemento punterà a null, indicando che non ci sono ulteriori elementi. Analizziamo ora la prima parte, della funzione, supponendo quindi che ci sia già un elemento nella lista.
In questo caso il puntatore p passato alla funzione non avrà più valore NULL, ma punterà al primo elemento della lista. Quindi procediamo in questo ramo del costrutto if-else. Come indicato sopra anche qui viene allocata un' area di memoria necessaria per contenere una struttura del tipo elemento. L' indirizzo del primo elemento di questo blocco di memoria viene passato al puntatore locale punt. Vengono poi assegnati dei valori agli elementi della struttura puntata dal puntatore punt, come nel caso precedente. In fine al puntatore pun del nuovo elemento inserito viene assegnato p ( puntatore che punta a quello che era il primo elemento della lista ed ora è diventato il secondo elemento della lista). La funzione termina restituendo ancora punt. Al termine di questa procedura avremo quindi un puntatore al primo elemento della nostra lista (il punt restituito dalla funzione), mentre il puntatore all' interno del primo elemento della lista (quindi l'ultimo elemento inserito), punterà all' elemento successivo (punt->pun = p;). Ricordiamo che p era il puntatore al primo elemento della lista che avevamo passato noi alla chiamata della funzione. Il puntatore all' interno del secondo elemento punterà invece a null, indicando che non ci sono ulteriori elementi. E cosi via per ogni elemento inserito in lista. Proseguiamo nell' analisi del programma e vediamo cosa succede all' interno del main.
Vengono dichiarate alcune variabili, e poi viene dichiarata un array di 10 puntatori a strutture di tipo elemento. Ciò presuppone che ci saranno ben 10 liste. Essendo però queste dieci liste ancora vuote, questi dieci puntatori devono avere tutti valore null. E proprio il ciclo for che troviamo dopo ha questo compito, tutti i puntatori vengono inizializato con null. Abbiamo quindi dieci liste vuote. Successivamente con chiamate a funzione vengono inserti elementi nelle liste. Con la funzione visualizzaContatto vengono poi stampati tutti gli elementi di una lista.
Il risultato stampato su schermo sarà:
La funzione visualizzaContatto ha il seguente aspetto:
Le viene passato come argomento un puntatore a struttura di tipo elemento e più esattamente il puntatore al primo elemento della lista. Con un ciclo while viene stampato il primo elemento della lista, dopo di che a p viene assegnato il valore di pun che punta al successivo elemento della lista, e cosi via finche p diventa uguale a null (il puntatore pun dell' ultimo elemento della lista avrà infatti valore null).
Tutto quanto riportato in questa pagina è a puro scopo informativo personale. Se non ti trovi in accordo con quanto riportato nella pagina, vuoi fare delle precisazioni, vuoi fare delle aggiunte o hai delle proposte e dei consigli da dare, puoi farlo mandando un email. Ogni indicazione è fondamentale per la continua crescita del sito.