
Come si implementa un tipo di dato astratto? Come esempio consideriamo un set di elementi con le operazioni di add, find, e drop*. Si applicano tutte ad un set ed ad un elemento del set e restituiscono, rispettivamente, l'elemento aggiunto, trovato od eliminato dal set.
La funzione find può essere utilizzata per implementare una condizione contains (contiene) che indica se un elemento è già contenuto in un set.
Da questo punto di vista, il set è un tipo di dato astratto. Per dichiarare ciò che possiamo fare con un set, possiamo scrivere il file header set.h

Le istruzioni per il preprocessore protegge le dichiarazioni: nessun problema con il numero di volte che includiamo il file set.h, il compilatore C vedrà una sola dichiarazione. Questa tecnica di protezione dei file header è talmente standard che il preprocessore C GNU lo riconosce e non effettua accessi a tale file (set.h) quando è definito il suo simbolo di protezione.
Il file set.h è completo, ma è utile? Non possiamo saperlo, quello che possiamo assumere per ipotesi è che Set dovrà in qualche modo rappresentare il fatto che siamo lavorando con i set; add() prende un elemento, lo aggiunge al set e restituisce ciò che è stato appena aggiunga o che è già presente nel set; find() cerca un elemento nel set e ne indica la sua presenza o meno (in questo caso restituisce un puntatore a null); drop() trova un elemento, lo rimuove dal set e restituisce ciò che è stato rimosso; contains() converte il risultato di find() in un valore vero o falso.
E' da notare che il puntatore generico void * viene usato largamente. Da una parte il generico puntatore permette di scoprire a che cosa il set corrisponde, ma d'altro canto permette di passare virtualmente qualsiasi cosa alla funzione add() e alle altre funzioni. Non tutto si comporterà come un set o come un elemento - stiamo sacrificando la sicurezza del tipo a favore dell'information hiding. Ad ogni modo, vedremo nel capitolo 8 che questo approccio può essere reso "sicuro".
*sfortunatamente, in C ANSI remove è una funzione di libreria che esegue l'eliminazione di un file. Se usassimo questo nome per una funzione non potremmo includere il file stdio.h
