gpt4 book ai didi

c++ - 我的 splay 树实现中的奇怪错误

转载 作者:行者123 更新时间:2023-11-30 05:22:15 26 4
gpt4 key购买 nike

我正在尝试为伸展树(Splay Tree)编写 C++ 模板结构,但是当我尝试测试代码时,我得到了非常奇怪的结果。

这是我的模板代码:

template <class T>
struct splaytree {
struct node {
splaytree<T> *tree;
node *p, *c[2];
T v;
int w;
node(T t, splaytree<T> *st) {
v = t;
p = 0;
c[0] = 0;
c[1] = 0;
w = 1;
tree = st;
}
int side() {
return (p->c[1] == this) ? 1:0;
}
void r() {
node *x = this;
int b = x->side();
node *p = x->p;
x->w = p->w;
p->w = x->c[1^b]->w + 1 + p->c[1^b]->w;
x->p = p->p;
p->p = x;
p->c[0^b] = x->c[1^b];
x->c[1^b] = p;
}
void splay() {
node *x = this;
while (x->p) {
node *p = x->p;
if (p == tree->root) x->r();
else if (((x->side())^(p->side()))) {
x->r();
x->r();
}
else {
p->r();
x->r();
}
}
tree->root = this;
}
int index() {
this->splay();
return this->c[0]->w;
}
};
node *root;
splaytree() {
root = 0;
}
void add(T k) {
node x0(k,this);
node *x = &x0;
if (root == 0) {
root = x;
return;
}
node *i = root;
while (i != x) {
int b = (k < i->v) ? 0:1;
if (i->c[b] == 0) {
i->c[b] = x;
i->w++;
x->p = i;
}
i = i->c[b];
}
x->splay();
}
};

我正在用它来测试它:

int main() {
splaytree<int> st;
st.add(2);
cout << st.root->v << endl;
cout << st.root->v << endl;
st.add(3);
cout << st.root->c[0] << endl;
}

我插入了元素2,然后打印了两次根节点的值。不知何故,这两张照片给了我两个不同的值(Ideone 中的 2 和 10 http://ideone.com/RxZMyA)。当我在我的计算机上运行该程序时,它给了我 2 和 1875691072。在这两种情况下,当在 2 之后插入一个 3 时,根节点的左子节点是一个空指针,而它应该是一个包含 2 的节点对象。

有人能告诉我为什么在两次打印同一内容时会得到两个不同的值,以及我可以做些什么来使我的 splaytree.add() 函数按预期工作吗?谢谢!

最佳答案

之后

    node x0(k,this);
node *x = &x0;
if (root == 0) {
root = x;
return;
}

root 是局部变量的地址。当您打印 root->v 时,x0 已超出范围。所有关于 root 真正指向什么的赌注都落空了。

关于c++ - 我的 splay 树实现中的奇怪错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39733475/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com