链表不起作用(c ++)

时间:2016-09-13 20:21:13

标签: c++ linked-list

我正在尝试制作一个复制构造函数,以便我可以复制一个向量。它不起作用我怀疑因为节点被删除两次因为复制构造函数没有复制新节点而只是复制指向它们的指针。我不确定我的拷贝构造函数有什么问题。任何帮助表示赞赏。

$(document).ready(function() {

    var realStateBtn = $('#real-estate-center').parent();
    var link = $('#real-estate-center > .linkwidth');
    var realStateClass = $('.real-estate-center');
    var bankOwnedProps = $('#bank-owned-properties > span');
    var findYourHomesValue = $('#find-your-homes-value > span');

    realStateBtn.css('zIndex', 9999);

    realStateBtn.click(function() {
        window.location.href='https://realestatecenter.bankofamerica.com/';
    });

    link.click(function() {
        window.location.href="https://realestatecenter.bankofamerica.com/";
    });

    realStateClass.click(function() {
        window.location.href="https://realestatecenter.bankofamerica.com/";
    });     

    findYourHomesValue.click(function() {
        window.location.href="http://realestatecenter.bankofamerica.com/tools/marketvalue.aspx";
    });

    bankOwnedProps.click(function() {
        window.location.href="http://realestatecenter.bankofamerica.com/";
    });
});

由于

1 个答案:

答案 0 :(得分:0)

有些事情跳出来了:

首先,如果您在development environment's debugger中运行了一些测试代码,您可以看到正在进行的操作并更快地解决问题。调试器使用对于高效的程序员来说是必不可少的技能,因此越早学习它就越好。

其次是意识形态问题,如果你不同意,请不理我。 node无法获得链接列表可能具有的关于列表状态的信息,因此节点不应链接自身,取消链接本身或delete链接node而不指示通过链表来这样做。虽然自我管理行为很有用,但它不会始终是列表的正确行为。我发现最好保持node真的很蠢。

第三,在构造函数中,在初始化它们之前,没有任何变量被初始化。你不能指望它们具有有用或可预测的值,所以

node(node &obj){
    delete next;

进入未定义行为领域。 next的值尚未分配,因此未知,如果您尝试delete,则无法准确预测会发生什么。

解决方案:不要delete它。

node(node &obj)
{
    node* ptr = this;
    node* optr = &obj;
    while (true)
    {
        ptr->data = optr->data;
        optr = optr->next;
        if (optr == NULL)
            break;
        ptr->next = new node(1);
        ptr = ptr->next;
    }
}

可以在那里进行一些改进,但这不在问题范围之内。

旁注:

void func(node a)

按值传递a。这可能会比您预期的更早地触发复制构造函数。您可能希望在此处通过引用传递:

void func(node &a)

最后,

node b(1);
b = a;

不会触发复制构造函数。

node b(1);

构建b,没有其他链接。

b = a;

使用赋值运算符operator=a复制到b

但是没有定义operator=。这违反了三条规则。 What is The Rule of Three?阅读链接并查找。

对您而言,这意味着复制了next指针,而不是next node。您现在有两个node指向链接的node,换句话说是相同的列表,这很糟糕。删除一个,然后删除另一个的内容,使另一个无效。

node & operator=(node other) // pass by value copies the node
{
    delete next; // prevent leak of additional nodes. The smart destructor helps here.
    data = other.data; // copy data
    next = other.next; // steal remaining links from other. to save further copying
    other.next = nullptr; // prevent destruction of the remaining links when 
                          // other goes out of scope
    return *this;
}

我们不是复制复制构造函数中复制的工作,而是通过引用传递来复制构造函数。

作为有用的旁注,

node b = a;

将为您调用复制构造函数,并使用b初始化a,而不构建"临时"事先b

我不关心的任何其他问题,因为它们无法使用提供的框架进行测试。