在C++中处理指针和结构时出现问题



我为这个任务的解决方案编写了笛卡尔树。

我的完整代码

一开始我遇到了一个非常令人困惑的问题。。我有我的结构和两个功能。我需要在树上传递指针,进行一些操作,然后在将其传递给函数calc.之前,我需要我的原始对象值

struct item {
int prior;
long long key, sum;
item *l, *r;
item(long long key, int prior) {
this->key = key;
this->sum = key;
this->prior = prior;
this->l = nullptr;
this->r = nullptr;
}
};
typedef item *pitem;

long long calc(pitem &t, long long l, long long r) {
pitem first = nullptr, second = nullptr, out = nullptr;
split(t, l - 1, first, second);
split(second, r, out, first);
return sum(out);
}

*附加功能拆分

void split(pitem t, long long key, pitem &l, pitem &r) {
if (!t) {
l = r = nullptr;
return;
}
if (key < t->key)
split(t->l, key, l, t->l), r = t, update_info(r);
else
split(t->r, key, t->r, r), l = t, update_info(l);
update_info(t);
}

起初,我试图在没有"0"的情况下传递指针&quot;在功能上。它没有起作用。在那之后,我尝试创建具有相同值的临时值,并在函数中的这个新对象上传递指针,但它不起作用,甚至更糟的是:指针树上的原始对象也在那时发生了变化。。我用了很多东西,但都没用。这就像我试图创建临时值,而不改变*t指针上的主对象,但它仍然会随着它们而改变。请告诉我,我只在这个问题上花了可能是你的4英镑,但我仍然不知道该怎么办。。。

代码不完整,预期行为也不清楚,但存在一些明显的问题。此代码

if (!t) {
l = r = nullptr;
return;
}

毫无意义,trl不是指针,它们是引用。这段代码甚至不应该编译。在这里,您的代码属于规则之一";如何编写不受支持的代码";通过重复使用相同的变量名。当各种对象的标识符都相同时,很难将它们联系起来。

表达式r = tl = t将改变实际对象,它将由t引用的item分配给l,反之亦然。在其中一个之后,函数参数引用的两个项将彼此相等。通过引用传递的函数参数是原始对象的别名。

在函数split中,第一个参数不是引用,所以如果update_info打算更改t,它实际上不会更改任何内容。这里的函数参数t是通过值传递的,是用参数值初始化的局部变量。

最新更新