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.

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

Tags:  , , ,

Answer

  1. Avatar for 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:

    void insert_at_end(Node **head, int data)
    {
        Node *temp = new Node();
        temp->data = data;
        temp->next = NULL;
    
        if (*head == NULL)
        {
            *head = temp;
        }
        else
        {
            Node *last = *head;
            while (last->next != NULL)
            {
                last = last->next;
            }
            last->next = temp;
            cout << "Insertado " << data << " al final \n";
        }
    }
    

    Y en la función main(), las llamadas a insert_at_end deben pasar la dirección del puntero de cabeza:

    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);
    

Comments are closed.