PI-ITBA / 2024_01

9 stars 0 forks source link

listADT #385

Closed mipipet closed 1 week ago

mipipet commented 1 week ago

Hola! Estaba haciendo el ejercicio 8 de la guia 11 y en el add me marca en rojo muchas cosas pero no encuentro el error y al comparar con la solución no encuentro el problema. Este es mi código, no sé si quizas estoy haciendo mal el newSet quizas. Gracias!!

#include <stdio.h>
#include <stdlib.h>
#include "tp11_ej8.h"

typedef struct node {
    elemType head;
    struct node * tail;
} tNode;

typedef struct tNode * tList; 

struct listCDT {
    tList first;
    size_t size;
    int (*cmpFun) (elemType, elemType);
    tList next;
};

typedef struct setCDT{
    listADT list; 
    int cmp; 
}setCDT; 

listADT newList(int (*compare) (elemType e1, elemType e2)){
    listADT list=malloc(sizeof(list)); 
    list->first=NULL; 
    list->cmpFun=compare; 
    list->size=0; 
    return list; 
}

setADT newSet(int (*compare) (elemType e1, elemType e2)){
    setADT new=malloc(sizeof(new));
    if (new == NULL)
        return NULL;
    new->list=newList(compare);
    new->cmp=compare;
    return new; 
}

static tList addRec(tList list, elemType elem, int cmp, int *flag){
    int c;
    if (list==NULL || (c=cmp(list->head, elem)) > 0) {
        tList aux = malloc(sizeof(aux));
        aux->head = elem;
        aux->tail = list;
        *flag=1;
        return aux;
    }
    if ( c < 0) {
        // elem es "mayor" que el primero
        list->tail = insertRec(list->tail, elem, cmp, flag);
    }
    return list;
}

static int addToList(listADT list, int elem){
    int flag=0; //incializo flag en 0
    list->first=addRec(list->first, elem, list->cmpFun, &flag); 
    list->size+=flag; 
    return flag; 
}

int addElem(setADT set, elemType elem){ //devuelve 1 si se agrego, 0 si no
    return addToList(set->list, elem); 
}
marcelogarberoglio commented 1 week ago

Habría que ver el .h, si estás definiendo o incluyendo lo necesario para que no te diga que desconoce algunos tipos

mipipet commented 1 week ago

Este es mi .h

#include <stdlib.h>
#ifndef tp11_ej8.h
#define tp11_ej8.h

typedef char * elemType; 
typedef struct listCDT * listADT;
typedef struct setCDT * setADT; 
typedef int (*compare) (elemType e1, elemType e2);

setADT newSet(int (*compare) (elemType e1, elemType e2)); 

int addElem(setADT set, elemType elem);

int removeElem(setADT set, elemType elem); 

setADT setUnion(setADT set1, setADT set2); 

setADT setUnion(setADT set1, setADT set2); 

setADT restaSet(setADT l1, setADT l2); 

#endif`
marcelogarberoglio commented 1 week ago

Te edité los códigos anteponiendo el triple backtick Supongo que "el rojo" debe ser uno de estos, donde te dice que si al campo cmp (que es int) le querés asignar un puntero a función le hagas un casteo

image

otro debe ser que llamás a la función insertRec que no existe. también para elem usás a veces int, a veces elemtype.

mipipet commented 1 week ago

Perfecto, mil gracias Marcelo!