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

时间:2015-12-24 05:52:24

标签: c++ data-structures linked-list free delete-operator

我正在学习c ++并尝试创建一个Linked-List数据结构。 这是程序 -

的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 五 6 7 8 9

我的问题是为什么它不打印最后一项,即10。 还有一个问题,你可以看到我正在评论以下一行

//delete root

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

由于

3 个答案:

答案 0 :(得分:1)

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

应该是

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

答案 1 :(得分:1)

Porblem在else语句中使用此函数它不会到达最后一个节点,因为最后一个节点接下来将为NULL。还有一件事是你在显示函数中修改根应该是一个const函数。它不应该修改根。

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

关于你的第二个问题 - &gt;它不会清除记忆。但是因为应用程序关闭内存后它的一个小代码将被释放。释放内存总是最好的做法,否则你会有内存泄漏,如果这个数据结构被大量使用,它可能占用所有内存并使应用程序崩溃。

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

GOOGLE_ID = 'mygoogleId' 
GOOGLE_SECRET = 'mysecretID'
GOOGLE_REDIRECT = http://localhost:8090/users

答案 2 :(得分:0)

更改显示条件

#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就更好了。