拆分双重链表c++
Splitting Doubly linked list 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;
}
以下代码用于在节点的左(前)侧取消指定节点和列表的其余部分的链接,假设总是存在前一个节点(即带有头节点的列表):
auto unlinked_list_from( Node* p )
-> Node*
{
p->prev->next = nullptr;
p->prev = nullptr;
return p;
}
查找n’节点是另一个问题。
结合两者,在找到n’节点并将其与列表的其余部分断开链接时,是一个更高级别的问题,其中使用两个较低级别的解决方案。
在链表或树的内部指针中使用std::unique_ptr
或std::shared_ptr
这样的智能指针通常不是一个好主意。从销毁责任的意义上说,并不是每个节点都拥有前一个和下一个节点。这是使用原始指针的情况。
但是,除了学习和高级编程之外,请使用标准库容器,如std::vector
。
相关文章:
- 反向给定链表中的K节点
- 如果没有malloc,链表实现将失败
- 文本文件中的单词链表
- 努力将整数转换为链表。不知道我在这里做错了什么
- 链表,反向函数,数据结构
- 使用std::list创建循环链表
- 链表的泛型函数remove()与成员函数remove)
- 为什么不能修改对象中的值?另外,我如何改进此链表?
- 我们可以删除链表中静态内存中的节点吗
- C++,指针数组,指向双链表中的条目
- 链表中写入访问冲突的未知原因
- 如何修复链表类实现的未处理异常0xDDDDDDDD
- 打印所有链表的元素 (C++)
- 错误:需要类名(链表c++)
- 为什么C中的通用链表中存储的数据已损坏
- C++ 创建包含链表和字符串的对象的链接列表时出错
- 链表c++插入,所有情况都已检查,但没有任何工作
- 链表,将列表复制到另一个列表
- 为什么C++对链表中的下一个节点使用指针,而像 C# 或 Java 这样的语言只使用类 Node 的名称?
- 对单向链表进行排序时出现运行时错误