0

マルチレベルの二重リンク リストを作成しています。ノードの追加操作を実行しています。以下で説明するロジック コードによれば、値を出力する必要があるのに、出力されないため、混乱しています。出力は間違っていませんが、そのリストを平坦化するときに影響を与える可能性のある何か間違ったことをしている可能性があります。

このリストには 3 つのレベルがあります。addNode 関数は最初のレベルで追加しますが、addChild 関数は 2 番目または 3 番目のレベルの任意の場所にノードを追加します。

コードは次のとおりです。

Student* StudentList::addNode(int num)
{
    Student* node = new Student(num);
    if(head == 0) {
       head = node;
       tail = node;
    } else {
       node->prev = tail;
       tail->next = node;
       tail = tail->next;
    }

    return node;
}

子を追加:

Student* StudentList::addChild(Student* node1, int num)
{   
    Student* node = head;
    Student* temp;
    Student* temp1;

    // traversing the list to find exact location
    while(node != 0)
    {
        if(node->num == node1->num) {
            break;
        } else {
            temp = node->child;
            while(temp) 
            {
                if(temp->num == node1->num) {
                    node = temp;
                    break;
                } else {
                    temp1 = temp->child;
                    while(temp1) 
                    {
                        if(temp1->num == node1->num) {
                            node = temp1;
                            break;
                        } else {
                            temp1 = temp1->next;
                        }
                    }
                    temp = temp->next;
                }
            }   
            node = node->next;
        }
    }

    Student* newChild = new Student(num);
    Student* curr = node->child;
    if(curr == 0)
    {
        node->child = newChild;
    } else {
        while(curr->next)
        {
            curr = curr->next;
        }
        newChild->prev = curr;
        curr->next = newChild;
    }
    return node1;
}

主なメソッド コードは次のとおりです。

StudentList* sl = new StudentList();
Student* newNode;
Student* newNode1;

newNode = sl->addNode(1);
    newNode1 = sl->addChild(newNode,11);
        sl->addChild(newNode1, 111);
        sl->addChild(newNode1, 112);
    newNode1 = sl->addChild(newNode,12);
newNode = sl->addNode(2);
    newNode1 = sl->addChild(newNode,21);
    newNode1 = sl->addChild(newNode,22);
        sl->addChild(newNode1, 221);
        sl->addChild(newNode1, 222);
        sl->addChild(newNode1, 223);
newNode = sl->addNode(3);
newNode = sl->addNode(4);
    newNode1 = sl->addChild(newNode,41);
        sl->addChild(newNode1, 411);

sl->printList();

私の印刷リストコードは次のとおりです。

void StudentList::printList(){
Student* curr = head;
while(curr){
    cout<< *curr <<endl;
    if(curr->child){
        Student* newCurr = curr->child;
        while(newCurr){
            cout<< "*{"<<newCurr->num <<"}"<<endl;
            if(newCurr->child){
                Student* newCurr2 = newCurr->child;
                while(newCurr2){
                        //according to my login this 3rd level childs num(id) value 
                        //should be printed used only for 2nd level according to my 
                        //logic.. where is the problem am i doing wrong any thing?
                        cout<< "**{"<<newCurr2->num <<"}"<<endl;
                        newCurr2 = newCurr2->next;
                }
            }
            newCurr = newCurr->next;
        }
    }
    curr = curr->next;
}

}

どうぞよろしくお願いいたします。

4

1 に答える 1

0

コメントに入れた出力から、第 2 レベルでは何も追加されていないように見えます。ノードが第 2 レベルで追加されることを期待している場合、ノードは第 1 レベルに追加されています。

問題は add child 関数の一番下にあると思います:

Student* StudentList::addChild(Student* node1, int num)
{
    // rest of function. node1 is never modified 
    return node1;
}

あなたは常にノード入力をその関数に返しています。私はあなたの次のコードで考える

newNode = sl->addNode(1);
    newNode1 = sl->addChild(newNode,11);
        sl->addChild(newNode1, 111);
        sl->addChild(newNode1, 112);

newNode1 == nodeNodeあなたが期待していると思うように、子ノードではなく、それを見つけるでしょう。おそらく子関数の追加が返されるはずですnewChild

于 2013-09-20T15:53:31.913 に答える