codice:
/*  listaPtr1c.h
  ----------------
  file delle intestazioni di una libreria per la gestione di liste
  di numeri reali rappresentate con record e puntatori


  Nota: la libreria e' stata scritta esclusivamente a scopo didattico
*/


//COSTANTI GLOBALI:
//-----------------


#define TRUE 1
#define FALSE 0


typedef int boolean;


struct prodotto {
    char codice[10];
    char marca[20];
    char descrizione[20];
    int quantita;
};


typedef struct prodotto tipoValori;


struct selemento {
    tipoValori valore;
    struct selemento* next;
};


typedef struct selemento elemento;
typedef elemento* lista;


//PROCEDURE:
//----------
  void inizializza (lista* plista);
  //--> inizializza la lista l alla lista vuota
  //lista* plista --> la lista


  void leggi (lista* plista);
  //--> effettua la lettura dei valori della lista l dalla tastiera
  //lista* plista --> la lista


  void leggiValore(tipoValori* valore);
  //--> effettua la lettura di un valore della lista l dalla tastiera
  //tipoValori* valore --> il valore


  void stampa (lista l);
  //--> effettua la stampa dei valori della lista l sullo schermo
  //lista l --> la lista


  void stampaValore (tipoValori valore);
  //--> effettua la stampa di un valore della lista l sullo schermo
  //tipoValori valore --> il valore


  void salva (lista l, char* nomeFile);
  //--> salva i valori della lista l in un file
  //lista l --> la lista
  //string nomeFile --> il nome del file


  void salvaValore(FILE* outFile, tipoValori valore);
  //--> salva un valore della lista l su file
  //tipoValori valore --> il valore


  void carica (lista* plista, char* nomeFile);
  //--> carica i valori della lista l da un file
  //lista* plista --> la lista
  //string nomeFile --> il nome del file


  boolean caricaValore(FILE* inFile, lista* plista);
  //--> carica un valore della lista l da file
  //tipoValori valore --> il valore


  void aggiungiInCoda (lista* plista, tipoValori elem);
  //--> aggiunge "elem" in coda ai valori della lista l se
  //    questo e' possibile; "esito" segnala la riuscita
  //    dell'operazione
  //lista* plista --> la lista
  //float elem    --> elemento da aggiungere


  void aggiungiInPosizione (lista* plista, tipoValori elem, int pos);
  //--> aggiunge "elem" ai valori della lista l in posizione pos se
  //    questo e' possibile; "esito" segnala la riuscita
  //    dell'operazione
  //lista* plista --> la lista
  //float elem    --> elemento da aggiungere
  //int pos  --> posizione in cui aggiungere


  void eliminaInCoda (lista* plista);
  //--> elimina l'elemento in coda alla lista l se
  //    questo e' possibile; "esito" segnala la riuscita
  //  dell'operazione
  //lista* plista --> la lista


  void eliminaInPosizione (lista* plista, int pos);
  //--> elimina un elemento in posizione "pos" dalla lista l se
  //    questo e' possibile; "esito" segnala la riuscita
  //  dell'operazione
  //lista* plista --> la lista
  //int pos  --> posizione in cui aggiungere


//FUNZIONI:
//---------


  int numeroElementi (lista l);
  //--> restitituisce il numero di elementi della lista l
  //lista l --> la lista


  tipoValori elementoInPosizione (lista l, int pos);
  //--> restituisce l'elemento in posizione pos
  //lista l --> la lista
  //int pos --> elemento da cercare
  //NOTA: si assume che pos sia minore del numero di elementi
  //      della lista, altrimenti si genera un errore


  boolean confronta(tipoValori val1, tipoValori val2);


  int cercaPosizione (lista l, tipoValori elem);
  //--> se "elem" e' contenuto nella lista l ne restituisce
  //    la posizione; -1 altrimenti; nel caso l'insieme
  //    "ins" contenga piu' occorrenze di "elem", viene
  //    restituita la posizione della prima occorrenza
  //lista l --> la lista
  //float elem    --> elemento da cercare


  boolean listaVuota (lista l);
  //--> restituisce true se la lista e' priva di elementi
  //lista l --> la lista


  boolean listaPiena (lista l);
  //--> restituisce true se la lista e' completamente piena
  //lista l --> la lista