1

インターポジションの直後にノードを挿入するのに問題があり、ポインタへのすべてのリンクをチェックしてすべて正しいにもかかわらず、未処理の例外が発生し続けます。誰かが私のコードを見て、何がうまくいかないのか見てください。

void insert_after(DequeIterator<E>& iter, E x)
{
    if(_size == 0)
    {
        insert_front(x);
    }
    else
    {
        assert(!iter.at_end());

        // need to check, if its the iter is the last element
        // do insert_back instead
        if(iter.node() == _tail)
            insert_back(x);
        else
        {
            // create a temp2 pointer to hold the address of iter
            DNode<E>* temp2 = iter.node();
            // set temp2 equal to the address of the node after
            // iter before inserting
            iter.node()->next()->set_next(temp2);
            // create a new node to insert
            DNode<E>* temp = new DNode<E>(iter.node(), x, temp2);
            // set the iter->next to hold the address of the new node
            iter.node()->next()->set_next(temp);
            //set the address of temp2->prev to hold the address
            // of the new node.
            // This is also where I got the exception error !!!!
            temp2->prev()->set_prev(temp);
            _size++;
        }
    }   
}
4

2 に答える 2

1

推奨される解決策

a, citer指しているシーケンスがあり、その新しいノードに格納された値aが必要ですよね?そして、すべてのノードにはとポインターがあり、これらの名前のメソッドを使用して読み取ることができ、setter メソッドで設定できますよね? 次に、これを試してください:a, b, cxbprevnext

DNode<E>* a = iter.node(), c = a->next(); // both ends of the insert location
DNode<E>* b = new DNode<E>(a, x, c);      // assuming constructor sets pointers
a.set_next(b);
c.set_prev(b);

問題分析

では、なぜコードが失敗するのでしょうか?

iter.node()->next()->set_next(temp2);

nextのポインターを変更するのはなぜcですか? それはそのままにしておくべきです!

iter.node()->next()->set_next(temp);

同じ問題。さらに、これは以前の呼び出しを上書きしているように見えるため、無意味に見えます。

temp2->prev()->set_prev(temp);

そして今、あなたはprev前にノードのポインタを変更していますaか? さらに悪いことに。

于 2013-11-01T21:00:58.227 に答える