当前位置: 代码迷 >> C++ >> 指针的引述未生效
  详细解决方案

指针的引述未生效

热度:1178   发布时间:2013-02-26 00:00:00.0
指针的引用未生效
本帖最后由 000oo000 于 2013-02-02 11:29:21 编辑
我用visual stuido 2010 写下面二叉树的查找程序,

目的是使类中pCurrent指 针指向匹配的节点(Node<T>*),同时能发现父节点。

template<class T>
Node<T>* Tree<T>::FindNode_BSTree(Node<T>* & pNode, const T& datavalue, Node<T>* & pParent) const
{
if(pNode==NULL)
  return NULL;
if(pNode->data==datavalue)
  return pNode;

if(datavalue<pNode->data)
  return FindNode_BSTree(pNode->pLeftChild,datavalue,pNode);
else
  return FindNode_BSTree(pNode->pRightChild,datavalue,pNode);
};

查找匹配节点程序:

template<class T>
bool Tree<T>::Find_BSTree(const T& datavalue) 
{
Node<T>* pParent=NULL;
FindNode_BSTree(pCurrent,datavalue,pParent);

};

查找匹配节点父节点的程序:
template<class T>
Tree<T>* Tree<T>::GetParent()
{
Node<T>* pParent=NULL;
FindNode_BSTree(pCurrent,pCurrent->data,pParent);
};

按理说,指针的引用传递参数,外层实参指针随着形参改变而改变指向的位置。
结果,最后一打印pCurrent,pParent的值,还是原来的初始值,没有改变。很是奇怪。是编译器的问题还是程序的问题?
c++ c 二叉树,树 tree 指针的引用

------解决方案--------------------------------------------------------
你声明为了引用,但是你好像也没有改变实参啊,我给了下你的查找函数,你参考下,看看可行:
template<class T>
Node<T>* Tree<T>::FindNode_BSTree(const Node<T>* pNode, const T& datavalue, const Node<T>* & pParent) const
{
if(pNode ==NULL 
------解决方案--------------------------------------------------------
 pNode->data==datavalue)
  return pNode;
pParent = pNode;
if(datavalue<pNode->data)
  return FindNode_BSTree(pNode->pLeftChild,datavalue,pParent);
else
  return FindNode_BSTree(pNode->pRightChild,datavalue,pParent);
};

------解决方案--------------------------------------------------------
引用:
在递归调用 FindNode_BSTree(pNode->pLeftChild,datavalue,pNode)

用pNode->pLeftChild递归调用FindNode_BSTree(pNode,datavalue,pNode),相当于pNode=pNode->pLeftChild,个人认为下一次该函数的对指针的引用的时候,pNode已经指向了它的左孩子,所以……

不是这样的吧
------解决方案--------------------------------------------------------
在递归的过程中第一个参数是需要一级一级的向下伸展的,使用指针的引用是没有复制一份临时的指针,而是直接使用了pNode->pLeftChild指针域中的值,再说在程序中仅仅是查找并没有涉及到下层修改上层的指针指向的
  相关解决方案