PI-ITBA / 2024_01

9 stars 0 forks source link

TP11 ejercicio 8 #371

Closed mholgadoo closed 1 week ago

mholgadoo commented 1 week ago

quiero saber si las funciones de union, interseccion y resta de conjuntos estan bien.


*
/*Ejercicio 8
    Hacer un T.A.D. para conjuntos: elementos no repetidos, sin orden.
    Debe tener al menos las funciones de agregar o remover un elemento, unión, intersección y resta de conjuntos.
*/

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

typedef TNode * TList;

struct setCDT{
    TList first;
    size_t dim; //guardados
    size_t size; //espacio guardado
    compare cmp
};

typedef struct setCDT * setADT;

TList unionSetRec(TList l1, TList l2, size_t * added, compare cmp){
    if (l1 == NULL && l2 == NULL){
        return NULL;
    }

    Tlist new = malloc(sizeof(TNode));
    (*added)++;
    int c;

    if (l2 == NULL || c = cmp(l1->elem, l2->elem) < 0){
        new->elem = l1->elem;
        new->tail = unionSetRec(l1->tail, l2); 
    }else if (l1 == NULL || c > 0){
        new->elem = l2->elem;
        new->tail = unionSetRec(l1, l2->tail); 
    }else{
        new->elem = l1->elem;
        new->tail = unionSetRec(l1->tail, l2->tail);
    }
    return new;

}

//union de dos listas (como guarde ordenado es mas facil)
setADT unionSet(setADT set1, setADT set2){
    setADT new = malloc(sizeof(struct setCDT));
    size_t dim = 0;
    new->first = unionSetRec(set1->first, set2->first, &dim, set1->cmp);
    new->size = new->dim = dim;
    return new;
}

TList intersectionSetRec(TList l1, TList l2, size_t * added, compare cmp){
    if (l1 == NULL || l2 == NULL){
        return NULL;
    }

    int c;
    if (c = cmp(l1->elem, l2->elem) < 0){
        return intersectiontRec(l1->tail, l2); 
    }else if (c > 0){
        return intersectionRec(l1, l2->tail); 
    }else{
        Tlist new = malloc(sizeof(TNode));
        (*added)++;
        new->elem = l1->elem;
        new->tail = intersectionRec(l1->tail, l2->tail);
    }
    return new;
}

setADT intersectionSet(setADT set1, setADT set2){
    setADT new = malloc(sizeof(struct setCDT));
    size_t dim = 0;
    new = intersectionSetRec(set1->first, set2->first, &dim, set1->cmp);
    new->size = new->dim = dim;
    return new;
}

TList diffSetRec(TList l1, TList l2, size_t * added, compare cmp){
    if (l1 == NULL){
        return NULL;
    }
    int c;
    if (l2 == NULL || c = cmp(l1->elem, l2->elem) < 0){
        Tlist new = malloc(sizeof(TNode));
        (*added)++;
        new->elem = l1->elem;
        new->tail = intersectiontRec(l1->tail, l2);
    }else if (c > 0){
        return intersectionRec(l1, l2->tail); 
    }else{
        return intersectionRec(l1->tail, l2->tail);
    }
    return new;

}
*
marcelogarberoglio commented 1 week ago

precedencia if (c = cmp(l1->elem, l2->elem) < 0){

¿programa de prueba ?