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

只是我的一般想法。你实际上并没有在节点上进行任何迭代,那么为什么你需要一个迭代器呢?引用或指针也可以。我会初始化我的节点,比如

DNode<E>* temp = new DNode<E>(iter.node(), x, iter.node()->next());
// Initialize new node inbetween previous nodes
temp->prev()->set_next(temp); temp->next()->set_prev(temp);
// Cut ties between nodes to avoid cycles. 

假设left是prev,right是next。然后你所要做的就是在 iter 上设置 next。此外,您的变量会让您在记住它们是什么方面陷入困境。看起来在这段代码中,您正在获取当前节点,然后对它之后的节点说我在您之后。然后在新节点之前和之后使用当前节点初始化新节点。然后,您将新节点转到它之前的节点,该节点应该是当前节点,并将当前节点设置为前一个节点。这是假设函数执行我认为它们会为双向链表所做的事情,这显然是您正在做的事情。

于 2013-11-01T20:49:18.100 回答
1

建议的解决方案

您有序列a, citer指向a,并且您希望a, b, c将值x存储在该新节点b中,对吗?每个节点都有一个prev和一个next指针,可以使用这些名称的方法读取,并使用 setter 方法进行设置,对吗?然后试试这个:

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 回答