0

私は、二重ポインターが何であるか、およびそれらをどのように使用できるかについての知識を固めるために、二重ポインターで多くの作業を行ってきましたが、最近、非常に奇妙な問題に遭遇しました。if ステートメントでコードを開始することを避けるために、ダブル ポインターを使用して二重リンク リストにノードを挿入するコードを作成しようとしています。私のコードは次のとおりです。

Node* SortedInsert(Node *head,int data)
{
    Node** pp = &head;
    Node* newNode = new Node();
    newNode->data = data;
    newNode->next = NULL;
    newNode->prev = NULL;

    while(*pp){
        cout<<"prev: "<<(*pp)->prev<<" *pp: "<<*pp<<" next: "<<(*pp)->next<<" data inserted: "<<(*pp)->data<<endl;
        if((*pp)->data < newNode->data){
            if(!(*pp)->next){
                (*pp)->next = newNode;
                newNode->prev = *pp;
                cout<<" Node added: "<<newNode<<endl;
                return head;
            }
            pp = &(*pp)->next;
        } else{
            newNode->next = *pp;
            cout<<" new node next stored address: "<<newNode->next<<endl;
            if(!(*pp)->prev){
                (*pp)->prev = newNode;
                cout<<" Node added: "<<newNode<<endl;
                return newNode;
            }
            newNode->prev = (*pp)->prev;
            cout<<" new node prev stored address: "<<newNode->prev<<endl;
            newNode->prev->next = newNode;
            cout<<" new node prev stored address: "<<newNode->prev<<endl;
            (*pp)->prev = newNode;
            cout<<" new node prev stored address: "<<newNode->prev<<endl;
            cout<<" Node added: "<<newNode<<endl;
            return head;
        }
    }
    cout<<endl;
    return newNode;
}

私は主にこのelseステートメントに問題があります:

else{
        newNode->next = *pp;
        cout<<" new node next stored address: "<<newNode->next<<endl;
        if(!(*pp)->prev){
            (*pp)->prev = newNode;
            cout<<" Node added: "<<newNode<<endl;
            return newNode;
        }
        newNode->prev = (*pp)->prev;
        cout<<" new node prev stored address: "<<newNode->prev<<endl;
        newNode->prev->next = newNode;
        cout<<" new node prev stored address: "<<newNode->prev<<endl;
        (*pp)->prev = newNode;
        cout<<" new node prev stored address: "<<newNode->prev<<endl;
        cout<<" Node added: "<<newNode<<endl;
        return head;
    }

問題がないように、前へのリンクと次へのリンクが正しく順序付けられていると確信していますが、何らかの理由で、次の行に:

(*pp)->prev = newNode;

newNode prev もそれ自体に切り替えられますが、そうすべきではないと思います。私には明らかになっていなかったポインタの機能を見落としていたのでしょう。

プログラムからの出力は次のとおりです。

prev: 0 *pp: 0x158adb0 next: 0 data inserted: 1
Node added: 0x158adf0
prev: 0 *pp: 0x158adb0 next: 0x158adf0 data inserted: 1
prev: 0x158adb0 *pp: 0x158adf0 next: 0 data inserted: 4
new node next stored address: 0x158adf0
new node prev stored address: 0x158adb0
new node prev stored address: 0x158adb0
new node prev stored address: 0x158ae30
Node added: 0x158ae30
prev: 0 *pp: 0x158adb0 next: 0x158ae30 data inserted: 1
prev: 0x158ae30 *pp: 0x158ae30 next: 0x158adf0 data inserted: 2
prev: 0x158adb0 *pp: 0x158adf0 next: 0 data inserted: 4
new node next stored address: 0x158adf0
new node prev stored address: 0x158adb0
new node prev stored address: 0x158adb0
new node prev stored address: 0x158adb0
Node added: 0x158ae70
prev: 0 *pp: 0x158adb0 next: 0x158ae70 data inserted: 1
prev: 0x158adb0 *pp: 0x158ae70 next: 0x158adf0 data inserted: 3
prev: 0x158ae70 *pp: 0x158adf0 next: 0 data inserted: 4
 Node added: 0x158aeb0
prev: 0 *pp: 0x158adb0 next: 0x158ae70 data inserted: 1
prev: 0x158adb0 *pp: 0x158ae70 next: 0x158adf0 data inserted: 3
prev: 0x158ae70 *pp: 0x158adf0 next: 0x158aeb0 data inserted: 4
prev: 0x158adf0 *pp: 0x158aeb0 next: 0 data inserted: 7
new node next stored address: 0x158aeb0
new node prev stored address: 0x158adf0
new node prev stored address: 0x158adf0
new node prev stored address: 0x158aef0
Node added: 0x158aef0
prev: 0 *pp: 0x158adb0 next: 0x158ae70 data inserted: 1
prev: 0x158adb0 *pp: 0x158ae70 next: 0x158adf0 data inserted: 3
prev: 0x158ae70 *pp: 0x158adf0 next: 0x158aef0 data inserted: 4
prev: 0x158aef0 *pp: 0x158aef0 next: 0x158aeb0 data inserted: 6
prev: 0x158adf0 *pp: 0x158aeb0 next: 0 data inserted: 7
Node added: 0x158af30
prev: 0 *pp: 0x158adb0 next: 0x158ae70 data inserted: 1
prev: 0x158adb0 *pp: 0x158ae70 next: 0x158adf0 data inserted: 3
prev: 0x158ae70 *pp: 0x158adf0 next: 0x158aef0 data inserted: 4
prev: 0x158aef0 *pp: 0x158aef0 next: 0x158aeb0 data inserted: 6
prev: 0x158adf0 *pp: 0x158aeb0 next: 0x158af30 data inserted: 7
prev: 0x158aeb0 *pp: 0x158af30 next: 0 data inserted: 9
Node added: 0x158af70
Wrong Answer!  

リストが継続的に追加されるように、入力は一度に 1 つの数字に入れられます。

誰かがもっと明確にする必要がある場合は、hackerrank の問題へのリンクを次に示します。

https://www.hackerrank.com/challenges/insert-a-node-into-a-sorted-doublely-linked-list

私はプログラミングを上達させようとしている学生です:)どんな助けも大歓迎です!!

4

0 に答える 0