#include #include #include #define EXIT_SUCCESS 0 #define EXIT_WRONGCOMMANDLINE 1 #define EXIT_MEMORY 2 #define EXIT_OPENFILE 3 #define RIGA 80 enum _boolean { FALSE = 0, TRUE = 1}; typedef enum _boolean boolean; typedef struct _elemlibro elemlibro; typedef elemlibro *listalibri; typedef elemlibro *poslibro; struct _elemlibro { char AutoreTitolo[RIGA]; elemlibro *next, *prev; }; #define NO_ELEMENT NULL #define NO_LIST NULL listalibri crealista (); void distruggelista (listalibri *pL); poslibro primolista (listalibri L); poslibro ultimolista (listalibri L); boolean finelista (poslibro p, listalibri L); boolean listavuota (listalibri L); poslibro succlista (poslibro p, listalibri L); poslibro preclista (poslibro p, listalibri L); char *leggilista (poslibro p, listalibri L); void scrivilista (char *AutoreTitolo, poslibro p, listalibri L); void inslista (char *AutoreTitolo, poslibro p, listalibri L); void canclista (poslibro *p, listalibri L); void LeggeLineaComando (int argc, char *argv[], char *BiblioFile, char *RecordFile); listalibri CaricaBiblioteca (char *BiblioFile); void EsegueMovimenti (char *RecordFile, listalibri Scaffale, listalibri Prestati, listalibri Resi); void RiponeLibri (listalibri Scaffale, listalibri Resi); poslibro TrovaLibro (char *AutoreTitolo, listalibri L); void StampaListaLibri (listalibri L); int main(int argc, char *argv[]) { char BiblioFile[RIGA], RecordFile[RIGA]; listalibri Scaffale; listalibri Prestati; listalibri Resi; // 1) Interpretazione della linea di comando LeggeLineaComando(argc,argv,BiblioFile,RecordFile); // 2) Caricamento dei dati Scaffale = CaricaBiblioteca(BiblioFile); // 3) Allocazione delle strutture dati ausiliarie Prestati = crealista(); Resi = crealista(); // 4a) Algoritmo 1 (registrazione di prestiti e rese) EsegueMovimenti(RecordFile,Scaffale,Prestati,Resi); // 6a) Stampa dei libri rimasti StampaListaLibri(Scaffale); // 4b-6b) Algoritmo 2 (riordino della biblioteca) e stampa delle istruzioni RiponeLibri(Scaffale,Resi); // 5) Deallocazione delle strutture dati ausiliarie distruggelista(&Prestati); distruggelista(&Resi); // 6c) Stampa dei libri rimasti StampaListaLibri(Scaffale); // 7) Deallocazione dei dati distruggelista(&Scaffale); return EXIT_SUCCESS; } void LeggeLineaComando (int argc, char *argv[], char *BiblioFile, char *RecordFile) { if (argc != 3) { printf("Il formato della linea di comando e' errato!\n"); exit(EXIT_WRONGCOMMANDLINE); } strcpy(BiblioFile,argv[1]); strcpy(RecordFile,argv[2]); } listalibri CaricaBiblioteca (char *BiblioFile) { FILE *fBiblioFile; char Riga[RIGA]; listalibri Scaffale; fBiblioFile = fopen(BiblioFile,"r"); if (fBiblioFile == NULL) { printf("Errore nell'apertura del file %s!\n",BiblioFile); exit(EXIT_OPENFILE); } Scaffale = crealista(); fgets(Riga,RIGA,fBiblioFile); while (strcmp(Riga,"FINE\n") != 0) { // Elimina l'a capo dalla stringa Riga[strlen(Riga)-1] = '\0'; // Inserisce il nuovo libro in coda allo scaffale inslista(Riga,succlista(ultimolista(Scaffale),Scaffale),Scaffale); fgets(Riga,RIGA,fBiblioFile); } fclose(fBiblioFile); return Scaffale; } void EsegueMovimenti (char *RecordFile, listalibri Scaffale, listalibri Prestati, listalibri Resi) { } void RiponeLibri (listalibri Scaffale, listalibri Resi) { } poslibro TrovaLibro (char *AutoreTitolo, listalibri L) { return NO_ELEMENT; } void StampaListaLibri (listalibri L) { } listalibri crealista () { } void distruggelista (listalibri *pL) { } poslibro primolista (listalibri L) { return NO_ELEMENT; } poslibro ultimolista (listalibri L) { return NO_ELEMENT; } boolean finelista (poslibro p, listalibri L) { return NO_ELEMENT; } boolean listavuota (listalibri L) { return TRUE; } poslibro succlista (poslibro p, listalibri L) { return NO_ELEMENT; } poslibro preclista (poslibro p, listalibri L) { return NO_ELEMENT; } char *leggilista (poslibro p, listalibri L) { return ""; } void scrivilista (char *AutoreTitolo, poslibro p, listalibri L) { } void inslista (char *AutoreTitolo, poslibro p, listalibri L) { } void canclista (poslibro *pp, listalibri L) { }