为什么我的 C++ 程序不打印 LinkedList 的所有项目?

Why my c++ program doesn't print all the items of a LinkedList?

我正在学习 C++ 并尝试创建链表数据结构。 这是程序-

main.cpp

        #include <iostream>
        using namespace std;

    class LinkedList
    {
    public:
        int data;
        LinkedList *nextNode;

        void init(int value,LinkedList *root)
        {
            root->data=value;
            root->nextNode=NULL;
        }

        void add(int value,LinkedList *root)
        {
            LinkedList *temp=new LinkedList;
            if(root->nextNode==NULL)
            {
                //cout<<"IF ADD()"<<endl;
                temp->data=value;
                temp->nextNode=NULL;
                root->nextNode=temp;
            }
            else
            {
                //cout<<"else ADD()"<<endl;
                while(root->nextNode!=NULL)
                {
                    root=root->nextNode;
                }
                temp->data=value;
                temp->nextNode=NULL;
                root->nextNode=temp;
            }
        }

        void display(LinkedList *root)
        {
            if(root->nextNode==NULL)
            {
                cout<<root->data<<endl;
            }
            else
            {
                while(root->nextNode!=NULL)
                {
                    cout<<root->data<<endl;
                    root=root->nextNode;
                }

            }
        }

        void free(LinkedList *root)
        {
            if(root->nextNode==NULL)
            {
                delete root;
            }
            else
            {
                while(root->nextNode!=NULL)
                {
                    LinkedList *temp=root->nextNode;
                    delete root;
                    root=temp;
                }
            }
        }

    };

    int main()
    {
        LinkedList *root=new LinkedList;
        root->init(1,root);
        root->add(2,root);
        root->add(3,root);
        root->add(4,root);
        root->add(5,root);
        root->add(6,root);
        root->add(7,root);
        root->add(8,root);
        root->add(9,root);
        root->add(10,root);
        root->display(root);
        root->free(root);
        //root->display(root);
        //delete root;
        return 0;
    }

输出- 1个 2个 3个 4个 5个 6个 7 8个 9

我的问题是为什么它不打印最后一项,即 10。 还有一个问题,如您所见,我在下面的行中发表评论

//delete root

在我的主要方法中。 如果我不调用我的 free() 方法并取消注释怎么办?它会释放整个 LinkedList 吗?

谢谢

while(root->nextNode!=NULL)
{
    cout<<root->data<<endl;
    root=root->nextNode;
}

应该是

while(root!=NULL)
{
    cout<<root->data<<endl;
    root=root->nextNode;
}

问题在于 else 语句中的此函数不会转到最后一个节点,因为最后一个节点的下一个节点将为 NULL。还有一件事是您正在修改显示函数中的根应该是一个 const 函数。它不应该修改根。

void display(LinkedList *root)
        {
            if(root->nextNode==NULL)
            {
                cout<<root->data<<endl;
            }
            else
            {
                while(root->nextNode!=NULL)
                {
                    cout<<root->data<<endl;
                    root=root->nextNode;
                }

            }
        }

实际实现应该是这样的

void display(LinkedList *root) const
{
    LinkedList * temp = root;
    while(temp!=NULL)
    {
        cout<<temp->data<<endl;
        temp=temp->nextNode;
    }  
}

关于你的第二个问题->它不会清除内存。但是因为它是一个小代码,在应用程序关闭后内存将被释放。释放内存始终是最佳做法,否则会出现内存泄漏,如果大量使用此数据结构,它可能会占用所有内存并导致应用程序崩溃。

您的免费功能的实现也不正确。应该是这样

void free(LinkedList *root)
{
    LinkedList * temp = root;
    LinkedList * nodeToFree = root;
    while(temp!=NULL)
    {
        temp=temp->nextNode;
        delete nodeToFree;
        nodeToFree = temp;
    }
}

更改显示条件

#include <iostream>
    using namespace std;

class LinkedList
{
public:
    int data;
    LinkedList *nextNode;

    void init(int value,LinkedList *root)
    {
        root->data=value;
        root->nextNode=NULL;
    }

    void add(int value,LinkedList *root)
    {
        LinkedList *temp=new LinkedList;
        if(root->nextNode==NULL)
        {
            //cout<<"IF ADD()"<<endl;
            temp->data=value;
            temp->nextNode=NULL;
            root->nextNode=temp;
        }
        else
        {
            //cout<<"else ADD()"<<endl;
            while(root->nextNode!=NULL)
            {
                root=root->nextNode;
            }
            temp->data=value;
            temp->nextNode=NULL;
            root->nextNode=temp;
        }
    }

    void display(LinkedList *root)
    {
        if(root->nextNode==NULL)
        {
            cout<<root->data<<endl;
        }
        else
        {
            while(root !=NULL) // Change this condition
            {
                cout<<root->data<<endl;
                root=root->nextNode;
            }

        }
    }

    void free(LinkedList *root)
    {
        if(root->nextNode==NULL)
        {
            delete root;
        }
        else
        {
            while(root->nextNode!=NULL)
            {
                LinkedList *temp=root->nextNode;
                delete root;
                root=temp;
            }
        }
    }

在这里你只能显示一次,因为你正在改变它的根值所以如果你使用临时变量来显示会更好,就像@sanjay 在上面的例子中所做的那样。