我必须以特定的方式实现双向有序列表,我被卡住了。我有一个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
答案 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
请注意,您只修改下一个元素的“向下”指针。您还需要修改前一个元素的“向上”指针。
另请注意,您的新元素可能是列表中的第一个或最后一个元素,您应该特别处理这些情况。一旦这样做,您可能会发现不需要对空列表进行特殊处理。