es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Por qué no puedo ingresar elementos en la lista enlazada mientras la función está funcionando correctamente?

Escribí un programa para combinar dos listas enlazadas ordenadas en una y esta función fue la que usé para hacerlo, pero no funciona. El código de la función es el siguiente:

void combinar(Nodo **temp, Nodo *temp_1, Nodo *temp_2){
   while(temp_1 != NULL || temp_2 != NULL){
      if(temp_1->data > temp_2->data){
         push(temp, temp_2->data);
         temp_2 = temp_2->next;
      }
      else{
         push(temp, temp_1->data);
         temp_1 = temp_1->next;
      }
   }
   while(temp_1 != NULL){
      push(temp, temp_1->data);
      temp_1 = temp_1->next;
   }
   while(temp_2 != NULL){
      push(temp, temp_2->data);
      temp_2 = temp_2->next;
   }
}

Ahora, este código no agrega nada a la lista enlazada final. Si escribo algo como

push(temp, temp_1->data);

agregará elementos correctamente, por lo que el problema definitivamente no está en la función “push”. ¿Puede alguien decirme cuál es el problema con el código anterior?

El código completo se encuentra en la siguiente URL:
https://ide.geeksforgeeks.org/FZ8IS4PADE

Tags:  ,

Answer

  1. Avatar for davy.ai

    Hay un par de problemas con el código proporcionado que podrían estar impidiendo que se fusionen correctamente las dos listas enlazadas:

    1. En la condición del bucle while, temp_1 != NULL || temp_2 != NULL, el operador || significa que el bucle continuará siempre y cuando temp_1 o temp_2 no sea NULL. Sin embargo, esto puede hacer que el bucle continúe incluso si una de las listas ya ha sido completamente recorrida. Para solucionar esto, la condición debe usar el operador && en su lugar: temp_1 != NULL && temp_2 != NULL.
    2. En la declaración if-else, cuando temp_1->data > temp_2->data, el código inserta correctamente temp_2 en la lista temp y mueve temp_2 al siguiente nodo. Sin embargo, si temp_1->data <= temp_2->data, el código solo inserta temp_1->data en la lista temp, pero no mueve temp_1 al siguiente nodo. Esto puede hacer que el bucle quede atrapado en un bucle infinito si todos los nodos restantes en temp_1 tienen valores menores o iguales al nodo actual en temp_2. Para solucionar esto, tanto temp_1 como temp_2 deben moverse al siguiente nodo en cada iteración del bucle.

    En resumen, el código corregido debería verse así:

    c++
    void combine(Node** temp, Node* temp_1, Node* temp_2){
    while(temp_1 != NULL && temp_2 != NULL){
    if(temp_1->data > temp_2->data){
    push(temp, temp_2->data);
    temp_2 = temp_2->next;
    }
    else{
    push(temp, temp_1->data);
    temp_1 = temp_1->next;
    }
    }
    while(temp_1 != NULL){
    push(temp, temp_1->data);
    temp_1 = temp_1->next;
    }
    while(temp_2 != NULL){
    push(temp, temp_2->data);
    temp_2 = temp_2->next;
    }
    }

    Con estos cambios, la función debería poder fusionar dos listas enlazadas ordenadas correctamente.

Comments are closed.