【发布时间】:2021-06-05 19:29:40
【问题描述】:
我正在使用双向链表构建队列。我希望我的深拷贝构造函数递归地深拷贝整个队列,但是当我执行以下操作时出现分段错误:
// Recursive helper method for deep copy constructor
void queue::copyAllNodes(Node* og, Node *cpy) {
if(og == nullptr) back = og;
else {
cpy->previous = og->previous;
cpy->data = og->data;
cpy->next = og->next;
copyAllNodes(og->next, cpy->next);
}
}
我的构造函数有另一个辅助函数,允许我传入原始节点和要复制的复制节点。
【问题讨论】:
-
很可能
cpy不会按要求分配所有节点,还要考虑到新节点的创建。 -
如果你可以回收队列的推送功能,似乎没有必要。
-
嗯...看看你的代码。您没有看到递归调用实际上只是
copyAllNodes(og->next, og->next);,因为它前面有一行吗?我敢问到底是什么力量让你以递归方式而不是迭代方式完成简单的枚举和复制任务?通常情况下,递归正好落在“仅仅因为你可以并不意味着你应该”的范围内。 -
我只是想看看我能不能做到,但事实证明它并不像我想象的那么简单。我尝试了没有复制 cpy->next 但仍然有段错误
-
我同意 WhozCraig 关于不使用递归的观点。它不能很好地扩展(例如,假设你的列表有 100,000,000 个元素——你会得到堆栈溢出吗?)。我将从一个非递归函数开始,并首先使其工作[然后,if 你必须 递归解决方案]。您正在使用
queue成员函数,但实际上并未更改它(例如queue::push)。事实上,我认为即使对于迭代案例,您的解决方案也需要重构。您不需要为副本分配新节点(例如Node *dstnode = new Node(...);)吗?
标签: c++ queue doubly-linked-list recursive-datastructures