feat: Initial commit
This commit is contained in:
131
Laboratorio 7/Esercizio 1/pgList.c
Normal file
131
Laboratorio 7/Esercizio 1/pgList.c
Normal file
@@ -0,0 +1,131 @@
|
||||
// Laboratorio 7 - Esercizio 1 - pgList.c
|
||||
// Matteo Schiff - s295565
|
||||
|
||||
#ifndef PGLIST_C_DEFINED
|
||||
#define PGLIST_C_DEFINED
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#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
|
||||
Reference in New Issue
Block a user