gpt4 book ai didi

c++ 使用 *& 作为参数(指针乐趣,三级树方法)

转载 作者:行者123 更新时间:2023-11-30 04:19:56 25 4
gpt4 key购买 nike

我正在尝试编写一种将键值对添加到三级树的方法,但显然我做错了什么,因为每当我到达标记的代码时都会遇到段错误

void Tree::add(int k, Node *&r)
{
cout<<"add"<<endl;
if(r==NULL){
r = new Node(k);
//check(heap area);
}

开始问题代码

    else if(r->keyCount == 1){
cout<<"adding second key";
if(r->getKey() < k){
Node * temp = new Node(r->getKey(),k,r->data[0],0);
delete r;
r = temp;
r->keyCount++;
cout<<"test"<<endl;
}
else
{
Node * temp = new Node(k,r->getKey(),0,r->data[0]);
delete r;
r = temp;
r->keyCount++;
cout<<"test"<<endl;
}

结束代码

    }
else if(k < r->getKey())
{
cout<<"left"<<endl;
add(k,r->child[Node::L]);
}
else if(r->keyCount > 1 && k < r->getKey(1))
{
cout<<"middle"<<endl;
add(k,r->child[Node::M]);
}
else if(r->keyCount > 1 && k > r->getKey(1))
{
cout<<"right"<<endl;
add(k,r->child[Node::R]);
}
else
r = new Node(k);
}

我想做的是,如果在这个特定节点中使用的 2 个键中只有 1 个,则用一个新节点替换当前节点,该节点在适当的位置有键(较小的 val在 key[0] 中,key[1] 中的 val 更大)我该如何正确执行此操作?

我的代码显然删除了旧节点的地址和指针,但没有正确地将指针重新分配给新节点。

编辑更新代码。输出如下:

% p4
Enter pairs consisting of an int and a double. I create a
ternary tree, keeping the data in order, by int. Finish entering
data by pressing ^d
2 2
add
Entering the pair: 2, 2
1 1
add
adding second key to current node
test
Entering the pair: 1, 1
-1 -1
add
left
add
Entering the pair: -1, -1
3 3
add
right
Segmentation Fault

编辑 2如果您想查看所有代码,这里有一个包含整个项目的 zip 链接:http://sdrv.ms/WSrLfv

编辑 3更多错误数据——崩溃时 gdb 的输出

Program received signal SIGSEGV, Segmentation fault.
0x08051628 in getData (x=@0x8047554) at testTree.cc:26
26 x[k]=d;
Current language: auto; currently c++

编辑 4通过 gdb 单步执行到段错误:

Breakpoint 1, Tree::add (this=0x8047554, k=3, r=@0x8047554) at tree.cc:58
58 cout<<"add"<<endl;
(gdb) n
add
61 if(r==NULL){
(gdb) n
65 else if(r->keyCount == 1){
(gdb) n
87 else if(k < r->getKey())
(gdb) n
92 else if(r->keyCount > 1 && k < r->getKey(1))
(gdb) n
97 else if(r->keyCount > 1 && k > r->getKey(1))
(gdb) n
99 cout<<"right"<<endl;
(gdb) n
right
100 add(k,r->child[Node::R]);
(gdb) n

Breakpoint 1, Tree::add (this=0x8047554, k=3, r=@0x806416c) at tree.cc:58
58 cout<<"add"<<endl;
(gdb) n
add
61 if(r==NULL){
(gdb) n
62 r = new Node(k);
(gdb) n
107 }
(gdb) n
107 }
(gdb) n
Tree::operator[] (this=0x8047554, index=3) at tree.cc:47
47 return *(locate(index,root)->data);
(gdb) n
48 }
(gdb) n

Program received signal SIGSEGV, Segmentation fault.
0x08051628 in getData (x=@0x8047554) at testTree.cc:26
26 x[k]=d;
(gdb)

最佳答案

这应该有效。

响应您的编辑:我注意到您的输出中有一些有趣的东西:

-1 -1
add
left
add
Entering the pair: -1, -1

注意它是如何说“left”,然后因为递归调用而说“add”。但是,在使程序崩溃的输入中,您看不到“添加”:

3 3
add
right
Segmentation Fault

如果您查看 Tree::locate 函数:

Node * Tree::locate(int k, Node *rt) const
{
if(rt==NULL)
return rt;
if(k==rt->getKey())
return rt;
if(rt->keyCount>1 && k==rt->getKey(1))
return rt;
if(k < rt->getKey())
{
return locate(k,rt->child[Node::L]);
}
else if(rt->keyCount>1 && k < rt->getKey(1))
{
return locate(k,rt->child[Node::M]);
}
else if(rt->keyCount>1 && k<rt->getKey(1))
{
return locate(k,rt->child[Node::R]);
}
else
return NULL;
}

这一行:

else if(rt->keyCount>1 && k<rt->getKey(1))

与上一个条件相同,因此完全跳过。

关于c++ 使用 *& 作为参数(指针乐趣,三级树方法),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15489987/

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