Un ottimo esempio di strutture dati dinamiche è una semplice libreria per lo stack, una che usi una lista dinamica e che includa funzioni per inizializzare, pulire, inserire ed estrarre.
Il file di intestazione della libreria potrebbe essere questo:
/* Stack Library – Questa libreria contiene le funzioni base per gestire le operazioni su di uno stack di interi (facilmente estendibile) */ typedef int stack_data; extern void stack_init(); /* Inizializza la libreria Chiamare questa funzione prima di chiamare qualsiasi altra funzione. */ extern void stack_clear(); /* Elimina tutti i dati inseriti */ extern int stack_empty(); /* Restituisce 1 se lo stack è vuoto, 0 altrimenti. */ extern void stack_push(stack_data d); /* Inserisce il valore d nello stack */ extern stack_data stack_pop(); /* Restituisce l'elemento al top dello stack estraendolo e rimuovendolo dallo stack. Ritorna un valore non valido se lo stack è vuoto. */
Il codice della libreria è il seguente:
#include "stack.h"
#include <stdio.h>
/* Stack Library - This library offers the
minimal stack operations for a stack of integers */
struct stack_rec
{
stack_data data;
struct stack_rec *next;
};
struct stack_rec *top=NULL;
void stack_init()
/* Inizializza la libreria */
{
top=NULL;
}
void stack_clear()
/* Elimina tutti i dati inseriti */
{
stack_data x;
while (!stack_empty())
x=stack_pop();
}
int stack_empty()
/* Restituisce 1 se lo stack è vuoto, 0 altrimenti. */
{
if (top==NULL)
return(1);
else
return(0);
}
void stack_push(stack_data d)
/* Inserisce il valore d nello stack */
{
struct stack_rec *temp;
temp=
(struct stack_rec *)malloc(sizeof(struct stack_rec));
temp->data=d;
temp->next=top;
top=temp;
}
stack_data stack_pop()
/*Restituisce l'elemento al top dello stack estraendolo e rimuovendolo dallo stack.
Ritorna un valore non valido se lo stack è vuoto. */
{
struct stack_rec *temp;
stack_data d=0;
if (top!=NULL)
{
d=top->data;
temp=top;
top=top->next;
free(temp);
}
return(d);
}
Da notare che questa libreria realizza information hiding. Chi può avere accesso al solo file intestazione non può dire nulla di come lo stack è stato implementato. Si usano array? Si usano puntatori? Si usano files? Non è possibile dirlo.
Da notare che in C si può usare NULL. NULL è definito nella libreria stdio.h, pertanto ricordarsi di includere stdio.h quando si usano i puntatori. NULL è la stessa cosa di zero.
Approfondimenti ed esercizi
Aggiungere le funzioni dup count e add alla libreria dello stack per duplicare l'elemento di testa, restituire il numero di elementi dello stack e per aggiungere due elementi al top dello stack
Scrivere un programma che utilizzi la libreria di cui sopra, utilizzando un makefile (da scrivere anch'esso)
Errori in linguaggio C da evitare
• dimenticare le parentesi prima di referenziare un record.
• Dimenticare di liberare la memoria. Non è sufficiente scrivere top=NULL nella libreria dello stack, perchè questa azione crea blocchi “orfani” che necessitano di essere liberati
• Dimenticare di includere stdio.h quando si usano i puntatori e si utilizza NULL.






