Open juanhumphreys opened 3 weeks ago
#include <stdio.h>
#include <assert.h>
#include "utillist.h"
#include <stdlib.h>
TList restaList(TList lista1, TList lista2);
#define ELEMS 200
int main(void) {
int pares[ELEMS], impares[ELEMS];
for(int i=1; i <= ELEMS; i++) {
pares[i-1] = i * 2 ;
impares[i-1] = i * 2 - 1;
}
TList lPar = fromArray(pares, ELEMS);
TList lImpar = fromArray(impares, ELEMS);
TList lPar2 = restaList(lPar, lImpar);
assert(checkElems(lPar2, pares, ELEMS));
// Verificamos ademas que no sean los mismos nodos
assert(lPar2 != lPar);
assert(lPar2->tail != lPar->tail);
freeList(lPar2);
freeList(lPar);
freeList(lImpar);
int all[ELEMS * 2];
for(int i=1, j=0; i <= ELEMS; i++) {
all[j++] = i * 2 - 1;
all[j++] = i * 2 ;
}
TList lAll = fromArray(all, ELEMS * 2);
lPar = fromArray(pares, ELEMS);
TList lImpar2 = restaList(lAll, lPar);
assert(checkElems(lImpar2, impares, ELEMS));
freeList(lPar);
lPar = restaList(lAll, lImpar2);
assert(checkElems(lPar, pares, ELEMS));
freeList(lPar);
freeList(lAll);
lPar = NULL;
lImpar = fromArray(impares, ELEMS);
TList aux = restaList(lPar, lImpar);
assert(aux == NULL);
freeList(lImpar);
aux = restaList(lImpar2, lImpar2);
assert(aux == NULL);
freeList(lImpar2);
printf ("OK!\n");
return 0;
}
TList restaList(TList lista1, TList lista2){
if(lista1 == NULL){
return NULL;
}
if(lista2 == NULL){
return lista1;
}
TList new;
if(lista1->elem == lista2->elem){
return restaList(lista1->tail,lista2->tail);
}
else if(lista1->elem != lista2->elem && lista2->elem > lista1->elem){
return restaList(lista1, lista2->tail);
}
if((lista1->elem != lista2->elem) && lista2->elem <lista1->elem){
new=malloc(sizeof(TNode));
new->elem = lista1->elem;
new->tail = restaList(lista1->tail,lista2->tail);
return new;
}
}
Fijate que el test no solo verifica que en la lista que devuelven estén los elementos, sino que los nodos sean distintos Y que al liberar libera las listas completas, ya que son todas independientes. Al hacer esto
if(lista2 == NULL){ return lista1; }
Estás devolviendo un puntero a un nodo de la lista1, y lo que tenés que hacer es crear nuevos nodos, que tengan los mismos elementos que la lista1.
intente cambiar lo que me dijsite y lo que me salio fue esta version. lo que hago (o lo que pienso que hago) es que si lista 2 es null entonces empiezo a gurdar los valores de lista 1 en new.
#include <stdio.h>
#include <assert.h>
#include "utillist.h"
#include <stdlib.h>
TList restaList(TList lista1, TList lista2);
#define ELEMS 200
int main(void) {
int pares[ELEMS], impares[ELEMS];
for(int i=1; i <= ELEMS; i++) {
pares[i-1] = i * 2 ;
impares[i-1] = i * 2 - 1;
}
TList lPar = fromArray(pares, ELEMS);
TList lImpar = fromArray(impares, ELEMS);
TList lPar2 = restaList(lPar, lImpar);
assert(checkElems(lPar2, pares, ELEMS));
// Verificamos ademas que no sean los mismos nodos
assert(lPar2 != lPar);
assert(lPar2->tail != lPar->tail);
freeList(lPar2);
freeList(lPar);
freeList(lImpar);
int all[ELEMS * 2];
for(int i=1, j=0; i <= ELEMS; i++) {
all[j++] = i * 2 - 1;
all[j++] = i * 2 ;
}
TList lAll = fromArray(all, ELEMS * 2);
lPar = fromArray(pares, ELEMS);
TList lImpar2 = restaList(lAll, lPar);
assert(checkElems(lImpar2, impares, ELEMS));
freeList(lPar);
lPar = restaList(lAll, lImpar2);
assert(checkElems(lPar, pares, ELEMS));
freeList(lPar);
freeList(lAll);
lPar = NULL;
lImpar = fromArray(impares, ELEMS);
TList aux = restaList(lPar, lImpar);
assert(aux == NULL);
freeList(lImpar);
aux = restaList(lImpar2, lImpar2);
assert(aux == NULL);
freeList(lImpar2);
printf ("OK!\n");
return 0;
}
TList restaList(TList lista1, TList lista2){
if(lista1 == NULL){
return NULL;
}
TList new;
if(lista2 == NULL){
new = malloc(sizeof(TNode));
new->elem=lista1->elem;
new->tail=restaList(lista1->tail, lista2) // voy copiando en new.tail todos los siguientes valores de lista1.
return new;
}
if(lista1->elem == lista2->elem){ //si son iguales paso al siguiente en ambos.
return restaList(lista1->tail,lista2->tail);
}
else if(lista1->elem != lista2->elem && lista2->elem > lista1->elem){ //si son distintos pero el elemento de lista 2 es mayor paso al siguiente en lista 2;
return restaList(lista1, lista2->tail);
}
else if((lista1->elem != lista2->elem) && lista2->elem <lista1->elem){ // son distintos y lista 2 es mayor entonces me interesa el valor de lsita 1 y los copio en new.
new=malloc(sizeof(TNode));
new->elem = lista1->elem;
new->tail = restaList(lista1->tail,lista2->tail);
return new;
}
Preguntar si es distinto y además mayor es redundante. Hace que sea más confuso el código. Pero parece que faltan casos de prueba, porque si lista2 es mayor al de lista1, entonces lo salteás, y tendría que ser al revés. Por ejemplo lista1 : 3-> 5 Lista2: 5-> 7 -> 8 retornás restaList 3 ->5, 7 -> 8 ) De hecho, si encontrás un elemento en lista2 que es mayor y lo salteás, a partir de ahí todos los elementos van a ser mayores, terminás llegando a lista2 igual a NULL. Eso hace que termines agregando todos los elementos de lista1, incluso los que deberías restar
Claro muchisimas gracias.
No me pasa el segundo assert, no entiendo que pasa ayuda por favor.