PI-ITBA / 2024_01

8 stars 0 forks source link

museumTicketADT #321

Closed bartosala closed 3 months ago

bartosala commented 3 months ago

Hola buenas, quería saber si mi resolución a este ejercicio es correcta, y que se podría mejorar. Pasa los tests del enunciado. Muchas gracias

La consigna es :

Se desea implementar un TAD para la venta de tickets para un museo, que permita saber cuántos tickets hay por día y por año, como así también obtener los nombres de las personas que reservaron tickets para un día determinado. Cada día se identifica por el orden dentro del año, al primero de enero le corresponde 1, al 2 de enero 2, al 1 de febrero 32, etc.

#include "museumTicketADT.h"
#include <stdlib.h>
#include <strings.h>
#include <string.h>

#define DAYS 366

struct node{
    char * name;
    struct node * next;
};

typedef struct node * List;

typedef struct day{
    List persons;
    List it;
    size_t cantP;
}day;

struct museumTicketCDT{
    day days[DAYS];
    size_t size;
};

museumTicketADT newMuseumTicket(void){
    return calloc(1, sizeof(struct museumTicketCDT));
}

static char * copyStr(const char * s) {
    return strcpy(malloc(strlen(s)+1), s);
}

List addRec(List l, const char * person, int * flag){
    char c;
    if(l == NULL || (c = strcasecmp(l->name, person)) > 0){
        List aux = malloc(sizeof(struct node));
        aux->name = copyStr(person);
        aux->next = l;
        *flag = 1;
        return aux;
    }
    if(c < 0){
        l->next = addRec(l->next, person , flag);
    }
    return l;
}

int addTicket(museumTicketADT museumTicketADT, size_t dayOfYear, const char * visitor){
    if(dayOfYear < 1 || dayOfYear > DAYS){
        return 0;
    }
    int flag = 0;
    museumTicketADT->days[dayOfYear - 1].persons = addRec(museumTicketADT->days[dayOfYear - 1].persons, visitor, &flag);
    museumTicketADT->days[dayOfYear - 1].cantP += flag;
    museumTicketADT->size += flag;
    return flag ? museumTicketADT->days[dayOfYear - 1].cantP : flag;
}

int dayTickets(const museumTicketADT museumTicketADT, size_t dayOfYear){
    if(dayOfYear < 1 || dayOfYear > DAYS){
        return -1;
    }
    return museumTicketADT->days[dayOfYear - 1].cantP;
}

int yearTickets(const museumTicketADT museumTicketADT){
    return museumTicketADT->size;
}

void toBeginByDay(museumTicketADT museumTicketADT, size_t dayOfYear){
    if(dayOfYear < 1 || dayOfYear > DAYS){
        exit(1);
    }
    museumTicketADT->days[dayOfYear - 1].it = museumTicketADT->days[dayOfYear - 1].persons;
}

size_t hasNextByDay(museumTicketADT museumTicketADT, size_t dayOfYear){
    if(dayOfYear < 1 || dayOfYear > DAYS){
        exit(1);
    }
    return museumTicketADT->days[dayOfYear - 1].it != NULL; 
}

char * nextByDay(museumTicketADT museumTicketADT, size_t dayOfYear){
    if(dayOfYear < 1 || dayOfYear > DAYS){
        exit(1);
    }
    if(!hasNextByDay(museumTicketADT, dayOfYear)){
        return NULL;
    }
    char * ret = museumTicketADT->days[dayOfYear - 1].it->name;
    museumTicketADT->days[dayOfYear - 1].it = museumTicketADT->days[dayOfYear - 1].it->next;
    return ret;
}

void freeList(List l){
    if(l == NULL){
        return;
    }
    freeList(l->next);
    free(l->name);
    free(l);
}

void freeMuseumTicket(museumTicketADT museumTicketADT){
    for(int i = 0; i < DAYS ; i++){
        if(museumTicketADT->days[i].cantP){
            freeList(museumTicketADT->days[i].persons); 
        }
    }
    free(museumTicketADT);
}
marcelogarberoglio commented 3 months ago

Está bien

bartosala commented 3 months ago

Ok! Muchas gracias