实现双向有序列表,如何返回指针以便为其赋值?

时间:2017-10-14 11:36:38

标签: c++ function pointers reference return

我必须以特定的方式实现双向有序列表,我被卡住了。我有一个Bag类,里面有一个Element类。现在的问题是我想把一个物品放在包里。

元素有一个键(它的值),一个指向较小元素(_down)的指针,一个指向较大的元素(_up)。当我在包中放入一个新元素时,代码如下(名称已翻译,因此更容易理解)

void Bag::put(int e) {
    if(_item_count==0){
        Element *element = new Element(e, nullptr, nullptr);
        _bot = element;
        _top = element;
    }else{
        Element *p = _bot;
        while(e > p->key()){
            p = p->up();
        }
        Element *element = new Element(e, p, p->down());
        p->down() = element;
    }
}

所以问题是p-> down()不可分配。我想我应该通过引用返回指针,但我不知道该怎么做。

down()函数

Bag::Element *Bag::Element::down() {
    return _down;
}

我试过把&在很多地方,但我无法弄清楚如何使它全部工作。

如果需要,这里是完整的代码,但它的变量大多是匈牙利语,如果需要,我会提供翻译。 Header on the left, cpp on the right

2 个答案:

答案 0 :(得分:0)

这将返回一个非常量左值引用指针,该指针最好分配给:

Bag::Element *&Bag::Element::down() {
    return _down;
}

也许你也应该提供一个const重载:

Bag::Element * const &Bag::Element::down() const {
    return _down;
}

当然你应该相应地更新你的班级声明。

而且你也可以考虑使用一个结构来处理像Element这样的简单类,同时将指针字段设为public(这是结构体的默认访问控制。通常你不会在C / C ++中这样做,不像在Java中即使对于超级简单的课程,人们也倾向于坚持使用私有字段和getter / setter。(我不是说这个好或坏,只是一种约定。)

答案 1 :(得分:0)

直接指定指针:

x1: any number
x2: the same number as x2.
y1: 10
y2: HEIGHT - 10

请注意,您只修改下一个元素的“向下”指针。您还需要修改前一个元素的“向上”指针。

另请注意,您的新元素可能是列表中的第一个或最后一个元素,您应该特别处理这些情况。一旦这样做,您可能会发现不需要对空列表进行特殊处理。