J'apprends le C ++ et j'ai essayé de créer une structure de données de liste liée. Voici le programme-

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

Sortie- 1 2 3 4 5 6 sept 8 9

Ma question est pourquoi il n'imprime pas le dernier élément, c'est-à-dire 10. Et une autre question, comme vous pouvez le voir, je commente dans la ligne suivante

//delete root

À l'intérieur de ma méthode principale. Et si je n'appelle pas ma méthode free () et que je décommente ceci? Est-ce que cela libérerait toute la LinkedList?

Merci

0
RajSharma 24 déc. 2015 à 08:52

3 réponses

Meilleure réponse

Porblem est avec cette fonction dans l'instruction else, il ne va pas au dernier nœud car le suivant du dernier nœud sera NULL. Une autre chose est que vous modifiez la racine dans la fonction d'affichage qui devrait être une fonction const. Il ne doit pas modifier la racine.

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

            }
        }

La mise en œuvre réelle devrait être comme ça.

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

En ce qui concerne votre deuxième question-> Cela n'effacera pas la mémoire. Mais parce que c'est un petit code après la fermeture de l'application, la mémoire sera libérée. Il est toujours préférable de libérer de la mémoire, sinon vous aurez des fuites de mémoire et si cette structure de données est fortement utilisée, elle peut prendre toute la mémoire et planter l'application.

La mise en œuvre de votre fonction gratuite n'est pas non plus correcte. Ça devrait être comme ça

void free(LinkedList *root)
{
    LinkedList * temp = root;
    LinkedList * nodeToFree = root;
    while(temp!=NULL)
    {
        temp=temp->nextNode;
        delete nodeToFree;
        nodeToFree = temp;
    }
}
1
sanjay 24 déc. 2015 à 06:15
while(root->nextNode!=NULL)
{
    cout<<root->data<<endl;
    root=root->nextNode;
}

Devrait être

while(root!=NULL)
{
    cout<<root->data<<endl;
    root=root->nextNode;
}
1
Xiaotian Pei 24 déc. 2015 à 06:02

Changer la condition d'affichage

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

Ici, vous ne pouvez l'afficher qu'une seule fois lorsque vous modifiez sa valeur racine.Il serait donc préférable d'utiliser la variable temporaire pour afficher comme fait par @sanjay dans le cas ci-dessus.

0
Kamaldeep singh Bhatia 24 déc. 2015 à 06:06