prof. Nunzio Brugaletta | Programmazione e linguaggio C |
Si è già trattato di pile e code implementandole in strutture sequenziali di memoria. È opportuno ricordare, come già fatto osservare a suo tempo, che la struttura sequenziale può andare bene solo a determinate condizioni:
Se gli elementi della struttura sono pochi e può essere effettuata una previsione sulla quantità degli elementi che troveranno posto nella struttura, ed inoltre se in ogni momento si può prevedere una occupazione media della struttura stessa (si ricordi che la struttura occupa una porzione fissa di memoria e non può essere ampliata: è quindi indispensabile un calcolo abbastanza esatto dello spazio necessario per evitare sprechi ed avere sempre a disposizione posto per inserire elementi nella struttura)
Se il problema da risolvere prevede l’uso di una sola struttura. Quando sono necessarie più strutture i problemi esposti in precedenza diventano più pressanti
L’allocazione dinamica permette di riservare spazio in memoria solo quando serve e solo quello che serve ed inoltre, l’uso di puntatori permette di operare più velocemente senza spostare fisicamente i dati, per esempio, nel passaggio di parametri. Sono questi due punti importanti nell’ottica di ottimizzazione di risorse: si tenga presente che l’elaboratore trova impiego nel trattamento di grosse masse di dati e quindi la razionalizzazione dello spazio occupato e la velocità di elaborazione sono due punti critici da curare particolarmente.
L’input di un nuovo elemento da inserire in una struttura di dati potrebbe essere svolto, utilizzando l’allocazione dinamica della memoria, secondo lo schema seguente:
/* Esempio di funzione per l’input di una struttura effettuato utilizzando l’allocazione dinamica della memoria */ #include <stdio.h> #include <stdlib.h> /*1*/ typedef struct rec { char titolo[50]; char autore[20]; char editore[20]; float prezzo; }libro; ... void inserisci(){ libro *buflib; /*2*/ buflib=(libro *) malloc(sizeof(libro)); /*3*/ if(buflib==NULL){ /*4*/ printf("\n\aImpossibile allocare nuovo spazio"); }else{ printf("\nInserimento di un libro"); printf("\nTitolo : "); gets(buflib->titolo); /*5*/ printf("Autore : "); gets(buflib->autore); /*5*/ printf("Editore : "); gets(buflib->editore); /*5*/ printf("Prezzo : "); scanf("%f",&buflib->prezzo); /*5*/ while(!getchar()=='\n'); ... /*6*/ } }
L’inclusione specificata in 1 permette di utilizzare le funzioni per l’allocazione dinamica della memoria.
Nella 2 si definisce un puntatore alla struttura libro. In questo modo non si alloca spazio in memoria come sarebbe se fosse stata definita una variabile di tipo libro. Lo spazio, necessario prima di effettuare l’input, viene allocato in 3.
La funzione malloc quando non riesce ad allocare spazio ritorna il valore NULL nel puntatore: tale condizione è testata in 4. Per il modo con il quale il C tratta le condizioni, la 4 poteva più propriamente essere espressa come: if(!buflib).
Nelle 5 vengono effettuati gli input nelle varie componenti della struttura. Si noti l’uso dell’operatore -> per referenziare le singole componenti.
A cominciare da 6 si può usare l’input effettuato per le elaborazioni richieste. Qualora richiesto, per passare l’input effettuato ad una funzione, basta passare il puntatore (si può, per esempio, utilizzare const se si tratta di passaggio per valore).
http://ennebi.solira.org | ennebi@solira.org |