#include "listalibri2.h" listalibri crealista () { poslibro p; listalibri L = (listalibri) calloc(MAX+1,sizeof(elemlibro)); if (L == NULL) { printf("Memoria insufficiente per allocare la lista dei libri!\n"); exit(EXIT_MEMORY); } // La lista contiene solo la sentinella L[0].next = (poslibro) 0; L[0].prev = (poslibro) 0; // Gli altri elementi allocati stanno nella lista libera for (p = 1; p < MAX; p++) { L[p+1].prev = p; L[p].next = p+1; } L[1].prev = (poslibro) MAX; L[MAX].next = (poslibro) 1; return L; } void distruggelista (listalibri *pL) { free(*pL); *pL = NULL; } poslibro primolista (listalibri L) { poslibro p = L[0].next; return p; } poslibro ultimolista (listalibri L) { poslibro p = L[0].prev; return p; } boolean finelista (poslibro p, listalibri L) { boolean b = (boolean) (p == 0); return b; } boolean listavuota (listalibri L) { boolean b = (boolean) ( (L[0].next == 0) && (L[0].prev == 0) ); return b; } poslibro succlista (poslibro p, listalibri L) { poslibro q = L[p].next; return q; } poslibro preclista (poslibro p, listalibri L) { poslibro q = L[p].prev; return q; } char *leggilista (poslibro p, listalibri L) { return L[p].AutoreTitolo; } void scrivilista (char *AutoreTitolo, poslibro p, listalibri L) { strcpy(L[p].AutoreTitolo,AutoreTitolo); } void inslista (char *AutoreTitolo, poslibro p, listalibri L) { poslibro q = L[MAX].next; if (q == NO_ELEMENT) { printf("Memoria insufficiente per allocare il libro %s!\n",AutoreTitolo); exit(EXIT_MEMORY); } strcpy(L[q].AutoreTitolo,AutoreTitolo); // Togliere dalla lista libera L[L[q].prev].next = L[q].next; L[L[q].next].prev = L[q].prev; // Mettere nella lista vera L[q].prev = L[p].prev; L[q].next = p; L[L[p].prev].next = q; L[p].prev = q; } void canclista (poslibro *pp, listalibri L) { poslibro q; q = *pp; L[L[q].prev].next = L[q].next; L[L[q].next].prev = L[q].prev; *pp = L[q].next; // Inserisce l'elemento cancellato in cima alla lista libera L[q].prev = MAX; L[q].next = L[MAX].next; L[MAX].next = q; L[L[MAX].next].prev = q; }