拆分双链表C ++

时间:2014-07-06 22:05:11

标签: c++

我想知道当我运行以下代码时,是否可以获得有关错误的原因:terminating with uncaught exception of type std::out_of_range: coordinates (400,0) outside valid range of [0, 399] X [0, 239]

该方法假设在传递给它的索引处拆分DLL。因此split(2)将使用2个节点保留调用它的列表,而旧列表的其余部分将作为新列表返回。我已经尝试了很多不同的方法来编写它,但它们都不起作用(我们必须使用unique_ptrs进行赋值)。

template <class T>
auto dl_list<T>::split(node* start, unsigned split_point)
    -> std::unique_ptr<node>
{
    assert(split_point > 0);
    if(start == nullptr)
        return nullptr;
    node* curr = start;
    uint64_t i = 0;
    while(i < split_point)
    {
    curr = (curr->next).get();
    i++;
   }
    std::unique_ptr<node> temp{nullptr};
    temp = std::move(curr->prev->next);
    (temp)->prev = nullptr;
    return temp;
}

这是包装方法,如果有帮助:

template <class T>
auto dl_list<T>::split(unsigned split_point) -> dl_list
{
if (split_point >= size_)
    return {};

if (split_point == 0)
{
    dl_list lst;
    swap(*this);
    return lst;
}

auto old_size = size_;
auto new_head = split(head_.get(), split_point);

// set up current list
size_ = split_point;
for (tail_ = head_.get(); tail_->next; tail_ = tail_->next.get())
    ;

// set up returned list
dl_list ret;
ret.head_ = std::move(new_head);
for (ret.tail_ = ret.head_.get(); ret.tail_->next;
     ret.tail_ = ret.tail_->next.get())
    ;
ret.size_ = old_size - split_point;
return ret;
}

1 个答案:

答案 0 :(得分:-1)

这是在节点的左(上)侧取消链接指定节点加上列表其余部分的代码,假设始终存在前一个节点(即带有标题节点的列表):

auto unlinked_list_from( Node* p )
    -> Node*
{
    p->prev->next = nullptr;
    p->prev = nullptr;
    return p;
}

查找 n '节点是一个单独的问题。

在找到 n '节点并将其与列表的其余部分取消链接时,将两者结合起来是一个更高级别的问题,使用两个较低级别的解决方案。


在链表或树的内部指针中,用户所有权智能指针(如std::unique_ptrstd::shared_ptr通常不是一个好主意。在承担破坏责任的意义上,每个节点都拥有前一个和下一个节点的情况并非如此。这是原始指针的一种情况。

但是,除了学习和高级编程之外,使用标准库容器,例如std::vector