Невозможно вставить и распечатать связанный список - PullRequest
0 голосов
/ 17 мая 2019

Я пытаюсь создать простой класс связанного списка.Программа запускается, но выдает неправильный вывод.И похоже, что связанный список не вставляет новые узлы так, как я хочу.

class Node
{
public:
    std::string name;
    Node *next;
};

class ProductName
{
private:
    Node *head;
public:
    ProductName()
    {
        head = NULL;
    }
    void insertNode(std::string input)
    {
        Node *temp;
        temp = new Node;
        temp->name = input;
        temp->next = head;
        head = temp;
    }
    void printOut()
    {
        Node *p;
        p = head;
        while (p->next != NULL)
        {
            std::cout << p->name << " ";
            p = p->next;
        }
    }
};

int main()
{
    ProductName object;
    object.insertNode("Hello");
    object.insertNode("world!");
    object.printOut();
}

Я ожидаю, что вывод будет Hello world!, но он выводит строку случайного символа 005C4BA0

Редактировать: я забыл указатель ... Это p->name не p в функции печати.Тем не менее, теперь мой результат world!.

1 Ответ

0 голосов
/ 17 мая 2019

Первый выпуск: Вы всегда вставляете в начало, заменяя head. Если вы ожидаете, что ваши узлы появятся в порядке вставки, вы должны вставить их в конце:

class ProductName
{
private:
    Node *head;
    Node *tail; // additional member to track the last node
public:
    ProductName()
        : head(nullptr), tail(nullptr)
    { }

    void insertNode(std::string input)
    {
        Node *temp = new Node{ std::move(input), nullptr };
        if (tail) {
            tail->next = temp;
            tail = temp;
        } else {
            head = tail = temp;
        }
    }
}

Второй выпуск: Вы печатаете все элементы, которые имеют next, что означает, что последний элемент не будет напечатан.

void printOut()
{
    Node *p = head;
    // print while p != nullptr
    // this also properly handles the empty list when head == nullptr
    while (p)
    {
        std::cout << p->name << " ";
        p = p->next;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...