PI-ITBA / 2024_01

9 stars 0 forks source link

Segundo Parcial 1C 2024 Ejercicio 3 #369

Closed mholgadoo closed 1 week ago

mholgadoo commented 1 week ago

*
typedef struct node{
    elemType elem;
    struct node * tail;
}TNode;

typedef TNode * TList;

typedef int (*compare)(elemtype e1, elemtype e2); //devuelve como strcmp

struct dataCDT{
    TList first;
    compare cmp;
    size_t dim;
}

/* Crea un TAD de elementos genéricos
*/

dataADT newData(compare cmp){
    dataADT new = malloc(sizeof(struct dataCDT));
    new->first = NULL;
    new->cmp = cmp;
    new->dim = 0;
    return new;
}
/* Agrega el elemento #elem, si no estaba. Retorna 1 si lo agrega, 0 si no
*/
TList addRec(TList l, elemType elem, compare cmp, int * flag){
    int c;
    if (l == NULL || c = cmp(l->elem, elem) > 0){
        TList new = malloc(sizeof(TNode));
        new->elem = elem;
        new->tail = l;
        *flag = 1;
        return new;
    }else if(c == 0){
        return l;
    }
    l->tail = addRec(l->tail, elem, cmp, flag);
    return l;

}

int addElement(dataADT data, elemType elem){
    int flag = 0;
    data->first = addRec(data->first, elem, data->cmp, &flag);
    data->dim += flag;
    return flag;
}
/* Elimina el elemento #elem, si estaba. Retorna 1 si lo elimina, 0 si no
*/

TList deleteRec(TList l, elemType elem, compare cmp, int * flag){
    int c;
    if (l == NULL || c = cmp(l->elem, elem) > 0){
        return l;
    }else if(c == 0){
        TList aux = l->tail;
        free(l);
        *flag = 1;
        return aux;
    }
    l->tail = addRec(l->tail, elem, cmp, flag);
    return l;

}
int deleteElement(dataADT data, elemType elem){
    int flag = 0;
    data->first = addRec(data->first, elem, data->cmp, &flag)
    data->dim -= flag;
    return flag;
}

/*
* La función #filter retorna 1 si el elemento debe incluirse en la respuesta y 0 si no
* Retorna un vector ordenado con aquellos elementos que cumplan con el criterio
* Si no hay elementos que cumplan con el criterio retorna NULL y setea *dim en cero
*/
elemType * elems(const dataADT data, int (*filter) (elemType), size_t * dim){
    elemtype * resp = NULL;
    resp = malloc(sizeof(elemtype) * data->dim);
    *dim = 0;
    TList l = data->first;
    for (int i = 0; i < data->dim; i++){
        if (filter(l->elem)){
            resp[(*dim)++] = l->elem;
        }
    }
    resp = realloc(resp, sizeof(elemType) * (*dim));
    return resp;
}
*

Esta bien?

marcelogarberoglio commented 1 week ago

Si lo probás (es lo mismo que ListADT, podés usar esos testeos), vas a ver que está mal, por ejemplo la precedencia c = cmp(l->elem, elem) > 0 o el hecho de que desde delete llamás a add