急~~晚上7点就实验了。。关于函数指针的传递,高手进~

RFbenson 2008-06-11 04:12:14
急~~晚上7点就实验了。。关于函数指针的传递,高手进~

void Fun(BinTreeNode<int>* p)
{
cout<<p->data<<' ';
}

int _tmain(int argc, _TCHAR* argv[])
{
cout<<Fun<<endl;
void (*Operation) (BinTreeNode<int>* p); //定义函数指针
Operation=Fun;
BinaryTree<int> myTree;
cout<<"please input the node data:('*' stands for null)"<<endl;
myTree.CreateBinTree();
myTree.PreOrder(myTree.root,Operation);

return 0;
}

我想实现在PreOrder类中将Operation()地址作为参数传进去,让他在PreOrder()中调用Fun()函数,执行输出!
怎样传递这个产生

//BinaryTree.h
//先序遍历

template <class type>
void BinaryTree<type>::PreOrder(BinTreeNode<type>* current,void(*Operation)(BinTreeNode<type>* p))
{
if(current!=NULL)
Operation(current);
PreOrder(current->LeftChild);
PreOrder(current->RightChild);
}

看书上迷迷糊糊的。。就这样用了。。编译没错。。


大侠,我想实现这个功能该如何传递Operation()函数呢?
...全文
256 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
不知道楼主哪出了问题,也不说清楚!
chen_jun_fen 2008-06-12
  • 打赏
  • 举报
回复

//先序遍历
template <class type>
void BinaryTree<type>::PreOrder(BinTreeNode<type>* current/*,void(*Operation)(BinTreeNode<type>* )*/)
{
if(current!=NULL)
{
// Operation(current);
cout<<current->data<<'\t';
PreOrder(current->LeftChild);
PreOrder(current->RightChild);
}
}

//主函数
myTree.PreOrder(myTree.root);


mdzhao 2008-06-12
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 RFbenson 的回复:]
C/C++ code//先序遍历
template <class type>
void BinaryTree<type>::PreOrder(BinTreeNode<type>* current/*,void(*Operation)(BinTreeNode<type>* )*/)
{
if(current!=NULL)
// Operation(current);
cout<<current->data<<'\t';
PreOrder(current->LeftChild);
PreOrder(current->RightChild);
}

//主函数
myTree.PreOrder(myTree.root);


输入:
abc**d**e*f**

结果:
a b c 就异常了!
[/Quote]
你把Operation去掉了还有异常,说明不是函数指针的传递的问题,检查一下代码吧

先加个大括号试试
if(current!=NULL)
{
// Operation(current);
cout<<current->data<<'\t';
PreOrder(current->LeftChild);
PreOrder(current->RightChild);
}
PreOrder(current->RightChild);
RFbenson 2008-06-12
  • 打赏
  • 举报
回复
//先序遍历
template <class type>
void BinaryTree<type>::PreOrder(BinTreeNode<type>* current/*,void(*Operation)(BinTreeNode<type>* )*/)
{
if(current==NULL)
return;

if(current!=NULL)
// Operation(current);
cout<<current->data<<'\t';
PreOrder(current->LeftChild);
PreOrder(current->RightChild);
}
RFbenson 2008-06-11
  • 打赏
  • 举报
回复
//先序遍历
template <class type>
void BinaryTree<type>::PreOrder(BinTreeNode<type>* current/*,void(*Operation)(BinTreeNode<type>* )*/)
{
if(current!=NULL)
// Operation(current);
cout<<current->data<<'\t';
PreOrder(current->LeftChild);
PreOrder(current->RightChild);
}

//主函数
myTree.PreOrder(myTree.root);



输入:
abc**d**e*f**

结果:
a b c 就异常了!
RFbenson 2008-06-11
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 ttkk_2007 的回复:]
问题都没描述清楚,你到底是创建出问题还是传参出问题
[/Quote]

创建改了后,函数指针传递好像出问题了:


//
void Fun(BinTreeNode<char>* p)
{
cout<<p->data<<' ';
}

int _tmain(int argc, _TCHAR* argv[])
{
cout<<Fun<<endl;
void (*Operation) (BinTreeNode<char>* p); //定义函数指针
Operation=Fun;

BinaryTree<char> myTree;
// cout<<&myTree<<endl;
// cout<<myTree.root<<endl;
myTree.InOrder(myTree.root,Fun);

return 0;
}

template <class type> class BinaryTree
{
public:
BinTreeNode<type>* root; //根结点

public:
BinaryTree(){ root=CreateBinTree( );}


//创建一棵二叉树
template <class type>BinTreeNode<type>* BinaryTree<type>::CreateBinTree()
{
type datax;
cin>>datax;
BinTreeNode<type>* p;
if(datax=='*') //读*时相应结点为空
p=NULL;
else
{
p=new BinTreeNode<type>;
p->data=datax;
p->LeftChild=CreateBinTree();
p->RightChild=CreateBinTree();
}
return p;
}


//中序遍历
template <class type>
void BinaryTree<type>::InOrder(BinTreeNode<type>* current,void(*Operation)(BinTreeNode<type>* ))
{
InOrder(current->LeftChild,Operation);
if(current!=NULL)
Operation(current);
InOrder(current->RightChild,Operation);
}




编译没错。。
有个警告:
'BinaryTree<char>::InOrder' : recursive on all control paths, function will cause runtime stack overflow

输入:
a**

出现异常了~

问题估计处在InOrder传递函数指针那里。。
RFbenson 2008-06-11
  • 打赏
  • 举报
回复
回复:lan_6373836
嗯,帮上忙了。。。
在构造中直接调用Create();赋值给root。。

谢了~
ttkk_2007 2008-06-11
  • 打赏
  • 举报
回复
问题都没描述清楚,你到底是创建出问题还是传参出问题
lan_6373836 2008-06-11
  • 打赏
  • 举报
回复
先序遍历:

template<class T>
void BiTree::PreOder(BiNode<T> *root)
{
if(root==NULL) return;
else
{
cout<<root->data;
PreOder(root->lchild);
PreOder(root->rchild);
}
}

帮到底!呵呵!
lan_6373836 2008-06-11
  • 打赏
  • 举报
回复

template<class T>
struct BiNode
{
T data;
BiNode<T> *lchild,rchild;
};
class BiTree
{
public:
BiTree(BiNode<T> *root);
private:
BiNode<T> *root;
void Creat(BiNode<T> *root)
};
template<class T>
BiTree::BiTree(BiNode<T> *root)
{
root=Creat();
}

BiNode<T> *BiTree::Creat()
{
cin>>ch;
if(ch=='#') return NULL;
else
{
root=new BiNode<T>;
root->data=ch;
root->lchild=Creat();
root->rchild=Creat();
}
}

不知道还来的急不?上完数据结构回来就看到了!真巧啊!呵呵!希望用的上!
RFbenson 2008-06-11
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 jieao111 的回复:]
myTree.PreOrder(myTree.root,Operation);

你想在PreOrder中多加个参数是吧,我试过,没有成功,好像这样的话,不能用递归了
[/Quote]

我不是想加参数,Operation()就相当于给PreOrder里面加个方法~~
RFbenson 2008-06-11
  • 打赏
  • 举报
回复
回复12楼

int行的是个问题。。
我改为char型

输入的时候。。没法停止。。
他一直等待输。····

咋办呢。。。。
jieao111 2008-06-11
  • 打赏
  • 举报
回复
myTree.PreOrder(myTree.root,Operation);

你想在PreOrder中多加个参数是吧,我试过,没有成功,好像这样的话,不能用递归了
yuzl32 2008-06-11
  • 打赏
  • 举报
回复

type datax; //如果type 是int,'*'也能够读取近来?
cin>>datax;
BinTreeNode <type>* p;
if(datax=='*') //读*时相应结点为空
p=NULL;

RFbenson 2008-06-11
  • 打赏
  • 举报
回复
在这个问题前面。。创建的时候卡主了。。

//创建一棵二叉树
template <class type>BinTreeNode<type>* BinaryTree<type>::CreateBinTree()
{
type datax;
cin>>datax;
BinTreeNode<type>* p;
if(datax=='*') //读*时相应结点为空
p=NULL;
else
{
p=new BinTreeNode<type>; //新的结点空间
p->data=datax;
p->LeftChild=CreateBinTree(); //构造左子树
p->RightChild=CreateBinTree(); //构造右子树
}
return p;
}

出错。。。

誰能给个创建算法。。

用类实现的。。。。
zbing0203 2008-06-11
  • 打赏
  • 举报
回复
typedef void(*PF)(BinTreeNode <type>*)
PF Operation=Fun;
myTree.PreOrder(myTree.root,Operation);
void BinaryTree <type>::PreOrder(BinTreeNode <type>* current, PF Operation)
yuzl32 2008-06-11
  • 打赏
  • 举报
回复

int _tmain(int argc, _TCHAR* argv[])
{
cout < <Fun < <endl;
void (*Operation) (BinTreeNode <int>* p); //定义函数指针
Operation=Fun; //Fun函数的地址传递给Operation
BinaryTree <int> myTree;
cout < <"please input the node data:('*' stands for null)" < <endl;
myTree.CreateBinTree();
myTree.PreOrder(myTree.root,Operation); //将Fun函数通过Operation传递进去

return 0;
}

yuzl32 2008-06-11
  • 打赏
  • 举报
回复
什么问题?myTree.PreOrder(myTree.root,Operation); 不是传递很好了么
RFbenson 2008-06-11
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 babyvox1999 的回复:]
这样树是int的才可以
[/Quote]

声明的是int类型的~
babyvox1999 2008-06-11
  • 打赏
  • 举报
回复
这样树是int的才可以
加载更多回复(5)

64,645

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧