// Laboratorio 6 - Esercizio 3 - pgList.c // Matteo Schiff - s295565 #ifndef PGLIST_C_DEFINED #define PGLIST_C_DEFINED #include #include #include #include "pgList.h" typedef struct node_s *link; typedef struct node_s { pg_t val; link next; } node; /* ADT di prima classe collezione di personaggi */ typedef struct pgList_s { link head; link tail; int nPg; } *pgList_t; link new_node(pg_t val, link next) { link t = malloc(sizeof(node)); if (t == NULL) { printf("ERROR: out of memory"); exit(2); } t->val = val; t->next = next; return t; } void free_node(link p) { pg_clean(&p->val); free(p); } /* creatore e distruttore */ pgList_t pgList_init() { pgList_t new = malloc(sizeof(struct pgList_s)); new->head = NULL; new->tail = NULL; new->nPg = 0; return new; } void pgList_free(pgList_t pgList) { link p, x; for (p = pgList->head, x = pgList->head->next; x != NULL; p = x, x = x->next){ free_node(p); } free(pgList); } /* lettura e scrittura su file */ void pgList_read(FILE *fp, pgList_t pgList) { while (!feof(fp)) { pg_t pgp; if (pg_read(fp, &pgp) != 0) { pgList_insert(pgList, pgp); } } } void pgList_print(FILE *fp, pgList_t pgList, invArray_t invArray) { link p; for (p = pgList->head; p != NULL; p = p->next) { pg_print(fp, &(p->val), invArray); } } /* inserimento di un nuovo personaggio */ void pgList_insert(pgList_t pgList, pg_t pg) { link new = new_node(pg, NULL); if (pgList->head == NULL) { pgList->head = new; } else { pgList->tail->next = new; } pgList->tail = new; } /* cancellazione con rimozione */ void pgList_remove(pgList_t pgList, char* cod) { link p, x; if (pgList->head == NULL) return; for (x = pgList->head, p = NULL; x != NULL; p = x, x = x->next) { if (!strcmp(x->val.cod, cod)) { if (p == NULL) { pgList->head = x->next; } else { p->next = x->next; // se tolgo l'ultimo elemento devo aggiornare `tail` if (x->next == NULL) pgList->tail = p; } free_node(x); break; } } } /* ricerca per codice, ritornando il puntatore */ pg_t *pgList_searchByCode(pgList_t pgList, char* cod) { link p; for (p = pgList->head; p != NULL; p = p->next) { if (!strcmp(p->val.cod, cod)) { return &(p->val); } } return NULL; } /* Si possono aggiungere altre funzioni se ritenute necessarie */ #endif