Ejercicio 2.a - take

Ejercicio 2.a - take

de Joel Cabrera Dechia -
Número de respuestas: 6

Buenas!
Cómo va?

Mi duda es la siguiente:

Si tengo un puntero "q" de nodos pero en un principio está "apuntando" a NULL, y defino otro "qR" que apunte a q, si yo empiezo a generar una lista a partir de "qR", al momento de retornar q, ¿devuelve la dirección del primer elemento de la lista qR? 

Me hace ruido porque entiendo que al apuntar a NULL, la sentencia qR = q no haría que qR apunte a un espacio de memoria (el mismo que el de q) sino que estaría indicando que qR no apunta a nada.

Dejo el código para ejemplificar:

lista take(uint i, lista l){
    uint cont = 0;
    lista q;
    if (l == NULL) q = NULL;
    else{
        lista qR = q;
        while(l != NULL && cont < i){
            qR = new nodo;
            qR->elem = l->elem;
            qR = qR->sig;
            l = l->sig;
            i++;
        }
        qR = NULL;
    }
    return q;
}

La idea de esto era guardar el primer elemento para retornar la lista, en caso de que esté mal podría ver el caso donde no hay elementos y a partir de ahí si ejecutar qR = q una única vez ya que me guardaría el espacio de memoria del primer elemento de la lista y podría retornarlo sin problemas. 

También si se ve algún error en el razonamiento o mismo en el código les agradezco que me lo hagan saber.

Saludos,
Joel

En respuesta a Joel Cabrera Dechia

Re: Ejercicio 2.a - take

de Federico Andrade -
Hola Joel,
La respuesta a tu pregunta es que No. Cuando vos pedís memoria para qR, q sigue apuntando a NULL. Lo que deberías hacer sería que una vez que pediste memoria para qR (qR apunta a un nodo), hacer q = qR, o sea que q también apunte a ese nodo. Si ahora seguís agregando nodos siguientes (a continuación del primero), supongamos moviéndote con qR, q te mantiene la referencia al primer elemento de la lista.

Sobre el código, tiene un par problemas
1) Efectivamente se pierde la referencia inicial de la lista que estás creando
2) Los nodos te están quedando desconectados, dado que al hacer qR = qR->sig , qR te queda apuntando a basura, dado que qR->sig nunca fue definido. Incluso si hubiera sido definido en NULL, también te iba a quedar desconectado.
3) Sería bueno inicializar q al crearla.

Hay dos formas de resolver este tipo de problemas. La primera es diferenciando el caso en el que tenés que crear el primer elemento del resto. Con esto te aseguras usar un alias para mantener la referencia y a su vez luego podés ir pidiendo memoria qR->sig = new nodo, para el resto de los casos, de forma que los nodos queden conectados.
Otra manera es crear una celda dummy, es decir un nodo que no forma parte de la lista pero la usas en forma auxiliar para poder construir la lista (como si ya tuviera un elemento). En este caso, antes de devolver la lista tenés que eliminar y liberar la memoria de la celda dummy.

Saludos,


En respuesta a Federico Andrade

Re: Ejercicio 2.a - take

de Gonzalo Maulella Mederos -

Hola Federico, yo creo que tengo bien encarado el ejercicio porque funciona para todos los casos menos para cuando le paso un i mayor que el largo de la lista, me devuelve toda la lista y un 0 al final, no logro encontrar el error. 

En respuesta a Gonzalo Maulella Mederos

Re: Ejercicio 2.a - take

de Gaston Notte -
Hola Gonzalo,
En realidad esa solución no funciona para los casos borde, y el ejemplo que pasas es uno de ellos.
Este error se debe a que creas un nodo de más, al cual no se le asigna ningún valor en "elem".
Cuando "l = NULL" o "i = 0", al imprimir la copia también te va a aparecer un 0 (de entrada creas un nodo y no le asignas valor a "elem").
En los casos intermedios esto no te sucede porque no entras al "if".
Saludos
En respuesta a Joel Cabrera Dechia

Re: Ejercicio 2.a - take

de Gaston Notte -
Hola Joel,
No, no devuelve la dirección del primer elemento.
Si originalmente q y qR apuntan a NULL, aunque vayas creando nodos en qR, q queda apuntando a NULL.

Te sugiero que analices qué debe retornar la función cuando la lista l es NULL o cuando el parámetro i == 0, y luego analizar qué hacer cuando la lista tiene al menos un elemento y se cumple que i > 0. Llevándolo a tu código, cuando la lista l tiene al menos un elemento, ya puedes crear un primer nodo y ahí sí hacer que dos punteros apunten a ese primer nodo para luego seguir avanzando con la solución.