¿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
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:
temp_1 != NULL || temp_2 != NULL
, el operador||
significa que el bucle continuará siempre y cuandotemp_1
otemp_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
.En la declaración if-else, cuando
temp_1->data > temp_2->data
, el código inserta correctamentetemp_2
en la listatemp
y muevetemp_2
al siguiente nodo. Sin embargo, sitemp_1->data <= temp_2->data
, el código solo insertatemp_1->data
en la listatemp
, pero no muevetemp_1
al siguiente nodo. Esto puede hacer que el bucle quede atrapado en un bucle infinito si todos los nodos restantes entemp_1
tienen valores menores o iguales al nodo actual entemp_2
. Para solucionar esto, tantotemp_1
comotemp_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.