Ej 6d

Ej 6d

de Amalia Lucia Balestrazzi Silveira -
Número de respuestas: 2

Buenas, 

Estoy teniendo un problema con mi código y no encuentro el error. Mi programa inserta correctamente después del nodo actual, pero no logro que al salir de la función el nodo actual sea el nuevo nodo insertado. Si embargo, dentro de la función, justo antes de salir, se verifica que el nodo actual está apuntando al nuevo nodo. La lista es pasada por referencia. Adjunto imagen del resultado de correr el programa y del código.


Como se puede ver, luego de insertar el primer elemento la lista es correcta y el actual apunta al único nodo. Luego de insertar el segundo elemento, este se inserta en el lugar correcto, y aunque dentro de la función la salida es que el nodo actual es el nodo insertado, al llamar a la función element se ve que fuera de la función el nodo actual no fue actualizado. A partir de ahí, todos los nodos se insertan luego de ese primer nodo, ya que nodo actual siempre apunta a él al salir de la función.

Mi código es el siguiente:


Por lo que veo es esencialmente igual al del video de la resolución, con la diferencia de que mi implementación de null() crea un nuevo cabezal y deja sus dos punteros en NULL, lo que cambia algún detalle de la función insert.

El código de principal donde llamo a las funciones es el siguiente (no creo que sea relevante, pero por las dudas):


Agradezco alguna ayuda para encontrar el error. Dejo los códigos en texto por acá abajo:

void insert(int x, lista &l) {
  nodo * nuevo_nodo = new nodo;
  nuevo_nodo->elem = x;
  nuevo_nodo->sig = NULL;
  //si la lista es vacia inserto al principio
  if (l->primero == NULL) {
    l->primero = nuevo_nodo;
  }
  //si no es vacia inserto despues del nodo actual
  else {
    nuevo_nodo->sig = l->actual->sig;
    l->actual->sig = nuevo_nodo;
  }
  //nodo actual pasa a ser el recien insertado
  l->actual = nuevo_nodo;
  printf("Actual despues de insertar: %d\n", l->actual->elem );
}

int element(lista l) {
  return l->actual->elem;
}
En respuesta a Amalia Lucia Balestrazzi Silveira

Re: Ej 6d

de Gaston Notte -
Hola Amalia, hice un main sencillo para probar únicamente tu insert y element, y me funciona perfectamente.
Te sugiero que hagas lo mismo, así puedes trabajar sobre algo fácil de probar.
Cómo estás haciendo el procedimiento que imprime tu lista?
Te consulto porque en tu impresión de pantalla se aprecia que imprimes la lista, pero no nos pasaste el código correspondiente. En una de esas pasas la lista por referencia y gestionas mal los punteros, lo que podría provocar el error.
En respuesta a Gaston Notte

Re: Ej 6d

de Amalia Lucia Balestrazzi Silveira -
Muchas gracias por la respuesta, me ayudó a encontrar el error que efectivamente estaba en la función que imprime la lista. Si bien no le paso por referencia la lista, al lista ser un puntero, la modificación del nodo actual se mantenía afuera de la función.

Copio el código de la función problemática que imprime la lista por completitud:

void impLista(lista lis) {
  if (lis->primero != NULL) {
    start(lis);
    do {
      printf("%d ", element(lis));
      next(lis);
    } while (lis->actual != lis->primero);
    printf("\n");
  }
}

Y esta es una versión del mismo código que no genera problemas:

void impLista(lista lis) {
  if (lis->primero != NULL) {
    start(lis);
    printf("%d ", element(lis));
    while (lis->actual->sig != NULL) {
      next(lis);
      printf("%d ", element(lis));
    }
    printf("\n");
  }
}

Saludos