今天在做任务时,需要将数据从文本中读出来,并且动态的存到二叉搜索树中,刚开始的做法如下:
void StockTree::insertNode(StockNode *p,StockNode *newNode)
{
if(p==NULL)
{
StockNode *temp=new StockNode(newNode->getStock(),NULL,NULL);
p=temp;
}
else if(newNode->myStock.getTag()<p->myStock.getTag())
insertNode(p->left,newNode);
else
insertNode(p->right,newNode);
size++;
root->getStock().display(cout);
}
void StockTree::loadRecords(ifstream &in)
{
string tt;
int ct;
long vt;
while(!in.eof())
{
StockNode *node;
in>>tt;
in>>ct;
in>>vt;
node->myStock.setTag(tt);
node->myStock.setCost(ct);
node->myStock.setVolume(vt);
insertNode(root,node);
}
}
结果发现读完后二叉树依然为空,但是读入的个数是正确的,检查后才发现insertNode(root,node)在传递参数时,指针root是作为值传递的,而在处理的过程中,我们要改变root的值则改变不了。
当我们把一个指针做为参数传一个方法时,其实是把指针的复本传递给了方法,也可以说传递指针是指针的值传递。
如果我们在方法内部修改指针会出现问题,在方法里做修改只是修改的指针的copy而不是指针本身,原来的指针还保留着原来的值。
要想改变指针的值,就需要改用指针的引用。void StockTree::loadRecords(ifstream &in)
{
string tag;
int cost;
long volume;
while(in>>tag>>cost>>volume)
{
Stock tempStock(tag,cost,volume);
insertRecords(root,tempStock);
}
}
void StockTree::insertRecords(StockNode * & cur,Stock data)
{
StockNode *left,*right;
if(cur==NULL)
{
StockNode *temp=new StockNode(data,NULL,NULL);
cur=temp;
}
else
{
if(data.compare(cur->getData())<0)
{
//left=cur->getLeft();
insertRecords( cur->left,data);
}
else
{
//right =(cur)->getRight();
insertRecords( cur->right,data);
}
}
}
注意,在调用时也不能使用
insertRecords( cur->getLeft(),data);
因为getLeft()返回的是指针,而不是指针的引用。