0

C++ OOP の知識を更新していますが、このトラバーサルを取得してリストの最後に追加して実行できる理由がわかりません。このコンテキストに関するアドバイスをいただければ幸いです。

    #include "stdafx.h"
    #include "LinkedList.h"

     LinkedList::LinkedList(void)
    {
    }


    LinkedList::~LinkedList(void)
    {
    }

        void LinkedList::add(Node* node)
           {
               Node* root = this->getRoot();
               if(root !=NULL)
                    {
//with two nodes the commented code worked 
                        //while(root->getNextNode() != NULL){}
                        //root->setNextNode(node);
//this part is culprit
                        Node* newNode = root->getNextNode();
                        while(newNode!=NULL)
                        {
                            newNode = newNode->getNextNode();
                        }
//I was thinking I am reaching to last node using this traversal
                        newNode = new Node(node->getData(),node->getNextNode());
                    }else
                    {
                        this->setRoot(node);
                    }

           };

    void LinkedList::traverseNodes()
        {
            Node* node = this->getRoot();
            printf("\ntraversing the nodes:");
            while(node != NULL){
                printf("%d", node->getData());
                node = node->getNextNode();
            }
        }
4

3 に答える 3

0

NULL に達してからでは手遅れです。その前にノードを追跡する必要があります。

void LinkedList::add(Node* node) {
  Node* current = this->getRoot();
  if (current != NULL) {
    while(current->getNextNode() != NULL) {
      current = current->getNextNode();
    }
    current->setNextNode(node); 
  } else {
    this->setRoot(node);
  }
};
于 2013-05-19T05:48:38.030 に答える
0

コードの問題は、ポインターnewNodeNULLに設定すると、新しいノードを指すようにしても、前の最後のノードが変更されないことです。

これを試して:

Node* root = this->getRoot();
if (root != NULL) {
    Node* parent = root;
    while(true) {
        // two variables mean you have access to the previous node,
        // which is needed to add the next one.
        Node* child = parent->getNextNode();
        if (child != NULL) {
            parent = child;
        } else {
            parent->setNextNode(/* new node */);
            break; // EDIT
        }
    }
} else //...
于 2013-05-19T05:49:24.493 に答える
0

その障害は、最後に追加しなかったためです。実際には、次のような方法でコードを修正できます

   Node* previouseNode = this->getRoot();
   while(previouseNode->getNextNode() != NULL)
   {
       previouseNode = previouseNode->getNextNode();
   }
   //Next node of previouseNode is null so you can assign to it
   Node * newNode = new Node(node->getData(), previouseNode); // Maybe your list is bi-directional!
   previouseNode->setNextNode(newNode);
于 2013-05-19T05:49:26.067 に答える