【问题标题】:Doubly List Copy Constructor: How different is it from a Singly List Copy Constructor?双列表复制构造函数:它与单列表复制构造函数有什么不同?
【发布时间】:2016-12-23 07:04:33
【问题描述】:

我刚刚完成了一个单列表复制构造函数的工作,我现在正着手制作一个双列表复制构造函数。谁能告诉我它与单列表构造函数有什么不同,因为我在重新开始我的双链表复制构造函数或复制我的单列表复制构造函数之间存在冲突。我该怎么办?

如果有帮助,这是我的单链表中的复制构造函数:

        List(const List &copying) : head(NULL)
        {
            Node* cur = copying.head;
            int size = copying.size();
            Node* end = NULL;
            for(int q = 0; q < size; q++)
            {
                Node* n = new Node;
                n->value = cur->value;
                if (head == NULL)
                {
                    head = n;
                    end = head;
                }
                else
                {
                    end->next = n;
                    end = n;
                }
                cur = cur->next;
            }
            end->next = NULL;
        }

欢迎任何和所有输入。谢谢大家:-)

【问题讨论】:

  • 如果您从一个空列表复制,您的单链表复制构造函数将会崩溃。链表的第一条规则:永远不要有特殊情况。 Node** target = &amp;head; for (Node* cur = copying.head; cur; cur=cur-next) { Node* n = new Node(cur-&gt;value); *target = n; target = &amp;(n-&gt;next); } *target = nullptr;
  • “炸毁”到底是什么意思 @MartinBonner?我实际上是 C++ 编程的新手。
  • @PeterG 该链接与复制构造函数无关。我已经检查过了,但它没有回答我关于双向链表的复制构造函数的查询。
  • 对不起。在下面回复之前没有注意到您的评论。当列表为空时,您永远不会将 end 设置为 NULL 以外的任何值,然后您写入 end-&gt;next - 这将(幸运地)导致访问冲突。 (如果没有,您可能正在嵌入式设备上运行,并且刚刚在某处喷射了中断向量。)
  • 我明白了,@MartinBonner。我错过了我的代码中的那个小故障:(。谢谢你澄清它!

标签: c++ copy-constructor doubly-linked-list


【解决方案1】:

我认为你只需要存储前一个节点(prv)。 假设您的节点具有 prv 作为数据成员。

List(const List &copying) : head(NULL)
{
    Node* cur = copying.head;
    int size = copying.size();
    Node* end = NULL;
    Node* prv = NULL:
    for(int q = 0; q < size; q++)
    {
        Node* n = new Node;
        n->value = cur->value;
        if (head == NULL)
        {
            head = n;
            end = head;
        }
        else
        {
            end->next = n;
            end = n;
        }
        n->prv=prv;
        prv=n;
        cur = cur->next;
    }
    end->next = NULL;
}

【讨论】:

  • 你已经重现了这个错误 - 尝试复制一个零长度列表!
  • @MartinBonner 这不就是 (head == NULL) { head = n; end = head; } 会完成的事情吗?
  • @NewbietoProgramming:不。如果 size 为零,则永远不会执行 for 循环,而我们有 end = NULL; {} end-&gt;next = NULL; 这是通过 end 的最后写入,在空循环情况下会杀死我们。 (如果end 为NULL,您可以通过测试解决此问题,但我对问题的评论中显示了更好的解决方法。)
  • @user1438832 哇,只需要多写 4 行代码就可以了!我期待它不止于此!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-14
  • 2013-10-13
  • 2012-02-28
  • 1970-01-01
  • 1970-01-01
  • 2020-01-14
相关资源
最近更新 更多