为什么我的 c++ 程序没有打印链接列表的所有项目?

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

本文关键字:列表 项目 链接 打印 我的 c++ 程序 为什么      更新时间:2023-10-16

我正在学习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吗?

感谢

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

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;
    }
}
while(root->nextNode!=NULL)
{
    cout<<root->data<<endl;
    root=root->nextNode;
}

应该是

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

更改显示的条件

#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在上面的情况下那样使用temp变量来显示它会更好。