我有一个树结构,我正在创建以下方式。据我所知,树是正确创建的。但是当我想从节点获取数据时,我会得到一些奇怪的acsii符号。
我如何设置数据。让它说空了。此刻无关紧要。我的计划中有价值。该函数自我馈送,直到我到达数据的末尾。
struct Node {
char Data;
Node* Left;
Node* Right;
};
Node maketree(0,s,split)
{
Node node;
node.Data=' ';
Node n1=subsplit(0,s,splitingat);
Node n2= subsplit(1,splitingat+1,e);
node.Left=&n1;
node.Right=&n2;
return node;
}
这就是我从树中获取数据的方式。
char decode(Node node,string text)
{
int currentindex=0;
Node sub=node;
{
}
if(text[currentindex]=='0')
{
sub=*sub.Left;
cout<<" x "<<sub.Data<<endl;
}
else if(text[currentindex]=='1')
{
sub=*sub.Right;
cout<<" x "<<sub.Data<<endl;
}
// cout<<sub.Data<<endl;
}
我认为错误在于我打印的是指针而不是节点。但我不知道我哪里出错了。
答案 0 :(得分:0)
问题的根源似乎在这里:
Node node;
node.Data=' ';
Node n1=subsplit(0,s,splitingat);
Node n2= subsplit(1,splitingat+1,e);
node.Left=&n1; // danger Will Robinson!
node.Right=&n2;
return node;
您将获取本地,临时,自动变量的地址,并将它们存储在您通过node
返回的指针中。只要return
执行,n1
和n2
就会被销毁,node.Left
和node.Right
会指向垃圾。你可以能够解决这个问题:
Node* n1=new Node(subsplit(0,s,splitingat));
Node* n2=new Node(subsplit(1,splitingat+1,e));
// side note: probably better to have subsplit() return dynamically-allocated Node*s to avoid the copy
node.Left=n1;
node.Right=n2;
但如果在其他地方做类似的事情,你可能仍会遇到问题。
沿着相同的行,在第二个代码块中,您正在检查每个节点的副本并将其存储到sub
中。将sub
设为Node*
可能更有意义。
最后,为了完全避免内存管理问题(几乎),请在上述所有内容中使用shared_ptr<Node>
代替Node*
。 :)