PI-ITBA / 2024_02

Consultas 2C 2024
4 stars 0 forks source link

TP10ej5 #125

Open juanhumphreys opened 3 weeks ago

juanhumphreys commented 3 weeks ago

No me pasa el segundo assert, no entiendo que pasa ayuda por favor.

juanhumphreys commented 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;
    }

}
marcelogarberoglio commented 3 weeks ago

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.

juanhumphreys commented 3 weeks ago

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.

juanhumphreys commented 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;
    }
    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;
    }
marcelogarberoglio commented 3 weeks ago

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

juanhumphreys commented 3 weeks ago

Claro muchisimas gracias.