Функция отображения связанного списка не показывает все узлы и говорит, что следующий узел пуст - PullRequest
0 голосов
/ 24 апреля 2020

Вывод:

Первоначальный список из 4 узлов содержит:

Указатель головы = 17357680 Узел № 1: Элемент = 20; Next = 00000000

Я не знаю, правильно ли я подключил узлы, поскольку он не отображает следующий из четырех. Я видел, как другие программисты добавляли хвостовой узел; нужен один? Это делает что-то проще? Я даже правильно подключил узлы в моем для l oop? Я новичок в этом, и я растерялся после того, как просмотрел много документации, видео на YouTube и прочитал прошлые вопросы по stackoverflow.

#include <iostream>

template<class T>
class Node
{
private:
    T        item;
    Node<T>* next;
public:
    Node();
    Node(const T& anItem);
    Node(const T& anItem, Node<T>* nextNodePtr);
    void setItem(const T& anItem);
    void setNext(Node<T>* nextNodePtr);
    T getItem() const;
    Node<T>* getNext() const;
};

template<class T>
Node<T>::Node() : next(nullptr)
{}

template<class T>
Node<T>::Node(const T& anItem) : item(anItem), next(nullptr)
{}

template<class T>
Node<T>::Node(const T& anItem, Node<T>* nextNodePtr) : item(anItem), next(nextNodePtr)
{}

template<class T>
void Node<T>::setItem(const T& anItem)
{
    item = anItem;
}

template<class T>
void Node<T>::setNext(Node<T>* nextNodePtr)
{
    next = nextNodePtr;
}

template<class T>
T Node<T>::getItem() const
{
    return item;
}

template<class T>
Node<T>* Node<T>::getNext() const
{
    return next;
}

template <class T>
void display(Node<T> *hdptr)
{
    Node<T>* curr = hdptr;
    while (curr != nullptr)
    {
        int count = 0;
        count++;
        std::cout << "Node #" << count << ": Item = " << curr->getItem() << "; Next = " << curr->getNext() << std::endl;
        curr = curr->getNext();
    }
}

int main()
{
    Node<int>* hdptr = nullptr, *tmp = new Node<int>, *n = new Node<int>;

    int const nodes = 4;
    for (int i=0, num=20; i<nodes; ++i, num+=10)
    {
        n = new Node<int>;
        n->setItem(num);
        tmp = n;

        if (hdptr==nullptr)
        {
            hdptr = n;
        }
        else
        {
            tmp->setNext(n);
        }
    }

    std::cout << "The intial 4-node list contains: " << std::endl;
    std::cout << "\nHead pointer = " << int(hdptr) << std::endl;
    display(hdptr);
}

1 Ответ

1 голос
/ 24 апреля 2020

Просто подумайте об этом

tmp = n;

, за которым вскоре следует

tmp->setNext(n);

Поскольку tmp == n в действительности вы делаете это

n->setNext(n);

что явно не так.

Вам нужен указатель на хвостовой узел? Это зависит от того, где вы пытаетесь добавить свои узлы. Если вы пытаетесь добавить их в конец списка, вам нужен указатель на хвостовой узел для удобного доступа к концу списка. Но если вы пытаетесь добавить свои новые узлы в начало списка, хвостовой указатель только усложнит ситуацию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...