Ejercicio 1 VI (isIncluded)

Ejercicio 1 VI (isIncluded)

de Nicolas Brignoni Dardano -
Número de respuestas: 6

Buenas estoy hace un rato haciendo este ejercicio y ya estoy medio confundido, no logro ver si anda o no. Tampoco tengo procedimientos que carguen y exhiban listas como para corroborar. Probé a manopla con unos casos y parece andar. Tal vez alguien tiene algo para implementarlo. Por eso, o por si alguien quiere hacer algún aporte o corregir algo dejo el código mas abajo y el .cpp.

Un saludo.

bool isIncluded (Lista l1, Lista l2){
  if (l2 == NULL)
    return true;
  else{
    Lista aux1;
    Lista aux2;
    while (l1 != NULL && aux2 != NULL && aux1 != NULL){
      while (l1 != NULL && (*l1).elem != (*l2).elem)
        l1 = (*l1).sig;
      if (l1 != NULL){
        aux1 = (*l1).sig;
        aux2 = (*l2).sig;
        while (aux1 != NULL && aux2 != NULL && (*aux1).elem == (*aux2).elem){
          aux1 = (*aux1).sig;
          aux2 = (*aux2).sig;
        }
        l1 = (*l1).sig;
      }  
    }//primer while
    if (aux2 == NULL)
      return true;
    else
      return false;
 
  }//cierro el else
}//procedimiento

En respuesta a Nicolas Brignoni Dardano

Re: Ejercicio 1 VI (isIncluded)

de Nicolas Brignoni Dardano -
Aprovecho cambien para preguntar esta bien tratar de cargar una lista recursivamente, me pareció mas fácil que hacerlo con iteración. En este caso se lee un entero antes de invocar a la función y los punteros pasados están inicializados en NULL. La consigna que se le da al usuario es ingresar una secuencia de números y finalizar con el -1 el cual no se adosa a la lista. 
Creo que una desventaja es que una vez que finaliza el VOID la variable p es global digamos, entonces va a seguir apuntando al ultimo nodo de la lista.
Dejo código.

void cargarListaRec(int &n, Lista &l, Lista &p){
if(n != -1){
p = new nodo;
(*p).elem = n;
(*p).sig = l;
l = p;
scanf("%d", &n);
cargarListaRec(n,(*l).sig, p);
}
}
En respuesta a Nicolas Brignoni Dardano

Re: Ejercicio 1 VI (isIncluded)

de Gaston Notte -
Hola Nicolás,
Sí, es posible cargar una lista de forma recursiva. Es más, en el Ejercicio 3 se pide que las operaciones se resuelvan regresivamente, entre ellas el insOrd.
No entiendo para qué usas dos listas. El procedimiento de carga de elementos debería definirse de la siguiente manera: void insOrd(int n, lista &l). Nota que luego de ejecutada la operación (post-condición) la lista l tendrá un nuevo nodo cuyo elemento sea = a n.
Para la implementación recursiva te recomiendo que identifiques cuál es el paso base y cuál el paso recursivo.
Saludos
En respuesta a Nicolas Brignoni Dardano

Re: Ejercicio 1 VI (isIncluded)

de Gaston Notte -
Hola Nicolás,
El problema está bien resuelto.
El detalle que veo es que tu solución chequea si l2 está incluida en l1, cuando debería ser al revés.
Para la próxima, te recomiendo que hagas tu propio main así puedes probar tu mismo las operaciones que hagas.
Saludos
En respuesta a Gaston Notte

Re: Ejercicio 1 VI (isIncluded)

de Nicolas Brignoni Dardano -
Gracias Gastón, estuve probando si hacer mi propio programita para probarlos pero se me complico en hacer un procedimiento que cargue las listas, el que puse mas arriba que que recursivo (que al final le saque la variable p porque Carlos me hizo dar cuenta de que es innecesaria) carga bien los nueve primeros nodos de la lista y creo que después se rompe, entonces no se si en realidad la esta cargando bien. Pero ya fue, si vos me decís que esta bien, yo compro.

Bueno, un saludo.
En respuesta a Nicolas Brignoni Dardano

Re: Ejercicio 1 VI (isIncluded)

de Gaston Notte -
Hola Nicolás,
Estoy de acuerdo con Carlos, primero intenta hacer el snoc de forma iterativa. Luego sí puedes probar hacerlo recurso.
Para su implementación debes tener presente algunas cosas:
1) el nodo se crea siempre y, como se inserta al final, el siguiente de este nuevo nodo siempre apunta a NULL.
2) identificar qué pasa cuando la lista l es vacía.
3) cuando la lista l no es vacía, cómo recorrerla correctamente para insertar al final.
Saludos
En respuesta a Nicolas Brignoni Dardano

Re: Ejercicio 1 VI (isIncluded)

de Facundo Benavides -
estimado,
agrego 2 comentarios a los ya realizados por Gastón.
1- faltan inicializar aux1 y aux2.
2- si bien la instancia l1==NULL, l2!=NULL se resuelve bien (al final del else), es de esos casos que vale la pena tratar aparte por claridad.
saludos