Closed mholgadoo closed 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?
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
Esta bien?