PI-ITBA / 2024_01

7 stars 0 forks source link

CollectADT #288

Closed jglaubart closed 4 months ago

jglaubart commented 5 months ago

Buenas, que tal? Estaba mirando un parcial y queria saber si lo que hice para el ejercicio 3 esta bien. Si solo indica que una funcion debe ser lo mas eficiente posible no significa que todas deban serlo no? Porque siento que es una resolucion no muy rebuscada, pero no se me ocurre otra forma. 2P 2022 2C.pdf

collectionADT newCollection(compare cmp){   //HACER
    collectionADT new = calloc(1, sizeof(collectionCDT)); //elems inicializado en NULL para luego hacer realloc
    new->cmp = cmp;
    return new;
}
void putElement(collectionADT c, elemType elem, size_t pos){  //HACER EFICIENTE
    if(pos < 0) {return;}
    if(pos > c->reserved){
        c->elems = realloc(c->elems, pos * sizeof(TElem));
    }
    c->elems[pos].elem = elem;
    c->elems[pos].isOccupied = 1;
}
int getPosition(collectionADT c, elemType elem){  //HACER
    if(c->count == 0) {return -1;}
    int ans = -1;
    for (int i=0; i<c->reserved; i++){
        if(c->elems[i].isOccupied && c->elems[i].elem == elem){
            ans = i;
        }
    }
    return ans;
}
marcelogarberoglio commented 5 months ago

Supongo que te referís al 4, no al 3. Es lo mismo que el vectorADT que se hizo en clase y está en la guía. Sin los structs no te puedo decir si está bien o no. Sólo decirte que nunca un unsigned puede ser negativo, así que esto if(pos < 0) {return;} no tiene sentido ¿Para qué estás recibiendo la función de comparación? Si le recibís es porque deberías usarla, por ejemplo en getPosition, en vez del == Y si estás usando el campo occupied con 0 o 1, cuando hacés el realloc deberías completar las nuevas posiciones con cero O sea, lo mismo que hicimos en vectorADT

jglaubart commented 5 months ago

Si perdon, era el 4. Lo de la funcion cmp no me di cuenta, seria cambiar las comparaciones de los elemtype y hacerlas con la funcion. Sacando entonces el if(pos<0){return;} estaria bien? Osea todas las posiciones serian validas. (lo hice suponiendo que el usuario me pasa las posiciones del vector teniendo al 0 como la primera) Ahora agrego lo de los 0 en isOccupied y estos son los structs del codigo:

typedef struct elem{
    elemType elem;
    char isOccupied;
}TElem;

typedef struct collectionCDT{
    TElem * elems;
    size_t reserved;  //espacio reservado, largo del vector
    size_t count;  // cantidad de elementos
    compare cmp;
} collectionCDT;

y asi me quedaria entonces la funcion putElement:

void putElement(collectionADT c, elemType elem, size_t pos){  //HACER EFICIENTE
    if(pos > c->reserved){
        c->elems = realloc(c->elems, pos * sizeof(TElem));
        for(int i = c->reserved; i<pos; i++){
            c->elems[i].isOccupied = 0;
        }
        c->reserved = pos;
    }
    c->elems[pos].elem = elem;
    c->elems[pos].isOccupied = 1;
}
marcelogarberoglio commented 5 months ago

Las estructuras están bien. Fijate que si tenés el campo count tenés que mantenerlo en putElement. Pero insisto, es lo mismo que el vectorADT que está en la guía, así que podés hacer ese y usar el test publicado para verificar que funcione.

jglaubart commented 5 months ago

Perfecto, gracias