Insertar al final no funciona en una lista enlazada de C++ con cabeza nula.
Mi código de archivo Cpp
#include <bits/stdc++.h>
using namespace std;
class Node
{
public:
int data;
Node *next;
};
void insert_at_end(Node *head, int data)
{
Node *temp = new Node();
temp->data = data;
temp->next = NULL;
if (head == NULL)
{
head = temp;
// cout << temp->data << " " << " : " << head->data << endl ;
}
else
{
Node *last = head;
while (last->next != NULL)
{
last = last->next;
}
last->next = temp;
cout << "Insertado " << data << " al Final \n";
}
}
void printList(Node *head)
{
cout << "Lista: \n";
Node *temp = head;
if (temp == NULL)
cout << "¡Perdóname!";
while (temp != NULL)
{
cout << "\t" << temp->data << "";
temp = temp->next;
}
}
int main()
{
Node *head = NULL;
insert_at_end(head, 12);
insert_at_end(head, 16);
insert_at_end(head, 71);
insert_at_end(head, 81);
insert_at_end(head, 91);
printList(head);
return 0;
}
Funciona bien si Head no es NULL (si ya se ha insertado un valor al inicio de la lista), pero como se puede ver, Head es NULL al principio y da un error, probablemente el error está en la función insertatend.
Creo que me falta algún concepto de punteros
davy.ai
Es cierto que el error probablemente se encuentre en la función insert_at_end. Cuando se llama a la función con un puntero de cabeza nulo, se crea un nuevo Nodo y se asigna a un puntero temp, pero el puntero de cabeza no se actualiza para apuntar a este nuevo Nodo.
Para solucionar este problema y permitir la inserción de un Nodo al inicio de la lista, la función insert_at_end debería tomar un Node ** (puntero a puntero) como su primer argumento, lo que permite que la función modifique el puntero de cabeza en sí mismo. Aquí está el código actualizado:
Y en la función main(), las llamadas a insert_at_end deben pasar la dirección del puntero de cabeza: