CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C语言

函数指针做参数的使用方法?

楼主tanchao1983()2005-04-02 14:22:11 在 C/C++ / C语言 提问

//   程序说明:  
  //   根据输入的二叉树原始数组nodelist,调用create_bitree建立二叉树的二叉链表存储结构,然后先序  
  //   遍历该二叉树,打印输出该二叉树的节点数据.  
   
  #include   <stdlib.h>  
  #include   <stdio.h>  
   
  //   树结构的声明  
   
  struct   tree  
  {  
  struct   tree   *left;   //   左子树  
  int   data;   //   节点数据  
  struct   tree   *right;   //   右子树  
   
  };  
   
   
  typedef   struct   tree   treenode;   //   树结构的新类型的声明  
   
  typedef   treenode   *bitree;     //   指向树结构的新类型的声明  
   
  typedef   bool   (*Visit)(int);//   函数指针类型的声明  
   
   
   
   
   
   
   
  //   函数原型的声明  
   
  //   插入一个节点,root   是二叉树的根节点,node   是这一次要插入的节点的数据值  
   
  bitree   insert_node(bitree   root,int   node);  
   
   
  //   生成一棵二叉树,data   是二叉树的原始数组,len   是原始数组的长度  
   
  bitree   create_bitree(int   *data,int   len);  
   
  //   打印函数,打印节点的值。函数返回true.  
   
  bool   printnode(int   e);  
   
  //   先序遍历二叉树root,对每个节点调用printnode,打印输出该节点的数据域。若遍历  
  //   成功则返回true,否则返回false  
  bool   preorder(bitree   root,Visit   print);   //   print   是函数指针  
   
   
   
   
   
   
   
   
  //   函数的实现部分  
   
   
  //   insert_node  
  bitree   insert_node(bitree   root,int   node)  
  {  
  bitree   newnode;   //   待插入的新节点  
   
  bitree   currentnode;//当前操作的节点  
   
  bitree   parentnode;   //   当前操作的节点的父节点  
   
   
  //   生成待插入的节点并初始化它的数据域和左右子树域  
   
  newnode=(bitree)   malloc(sizeof(treenode));  
   
  newnode->data=node;  
   
  newnode->left=NULL;  
   
  newnode->right=NULL;  
   
   
  if(root==NULL)  
  return   newnode;  
  else  
  {  
  currentnode=root;   //   从树根开始搜索  
   
  while(currentnode!=NULL)  
  {  
   
  parentnode=currentnode;   //   保存当前操作的节点  
   
  if(currentnode->data>node)  
  currentnode=currentnode->left;   //   向左子树搜索  
  else  
  currentnode=currentnode->right;   //   向右子树搜索  
   
  }  
   
  if(parentnode->data>node)  
  parentnode->left=newnode;  
  else  
  parentnode->right=newnode;  
  }  
   
   
  return   root;   //   返回二叉树的根节点  
  }  
   
   
  //   create_bitree  
   
  bitree   create_bitree(int   *data,int   len)  
  {  
  bitree   root=NULL;  
   
  int   i;  
   
  for(i=0;i<len;i++)  
  root=insert_node(root,data[i]);  
   
  return   root;     //   返回二叉树的根节点  
  }  
   
  //   printnode  
   
  bool   printnode(int   e)  
  {  
  printf("%d   ",e);  
  return   true;  
   
   
  }  
   
  //   preorder  
   
  bool   preorder(bitree   root,Visit   print)  
  {  
  if(root!=NULL)  
  {  
  if(print(root->data))  
  if(preorder(root->left,printnode))  
  if(preorder(root->right,printnode))  
  return   true;  
   
   
  return   false;  
   
   
   
   
  }  
  else  
  return   true;  
   
   
  }  
   
   
   
   
   
   
   
   
  //   主函数main(),输入二叉树原始数组,调用create_bitree生成二叉树的二叉链表存储结构,  
  //   并先序遍历二叉树输出每个节点的数据域。  
   
  void   main()  
  {  
  int   index=0,value;  
   
  bitree   root=NULL;  
   
  int   nodelist[20];  
   
  printf("请输入二叉树的原始数组(0表示结束):\n");  
   
  scanf("%d",&value);  
   
  while(value!=0)  
  {  
  nodelist[index]=value;  
  index++;  
  scanf("%d",&value);  
  }  
   
  root=create_bitree(nodelist,index);  
   
   
  printf("先序遍历二叉树:\n");  
   
   
   
   
  preorder(root,printnode);  
   
   
   
   
   
   
  printf("\n");  
   
   
   
   
   
   
   
   
  }  
   
  下面是在VC++6.0中的编译错误  
   
  --------------------Configuration:   bitree_preorder   -   Win32   Debug--------------------  
  Compiling...  
  bitree_preorder.c  
  D:\my   c   source   file\二叉树的先序遍历\bitree_preorder.c(23)   :   error   C2143:   syntax   error   :   missing   ')'   before   '*'  
  D:\my   c   source   file\二叉树的先序遍历\bitree_preorder.c(23)   :   error   C2143:   syntax   error   :   missing   '{'   before   '*'  
  D:\my   c   source   file\二叉树的先序遍历\bitree_preorder.c(23)   :   error   C2059:   syntax   error   :   ')'  
  D:\my   c   source   file\二叉树的先序遍历\bitree_preorder.c(44)   :   error   C2061:   syntax   error   :   identifier   'printnode'  
  D:\my   c   source   file\二叉树的先序遍历\bitree_preorder.c(44)   :   error   C2059:   syntax   error   :   ';'  
  D:\my   c   source   file\二叉树的先序遍历\bitree_preorder.c(44)   :   error   C2059:   syntax   error   :   'type'  
  D:\my   c   source   file\二叉树的先序遍历\bitree_preorder.c(48)   :   error   C2061:   syntax   error   :   identifier   'preorder'  
  D:\my   c   source   file\二叉树的先序遍历\bitree_preorder.c(48)   :   error   C2059:   syntax   error   :   ';'  
  D:\my   c   source   file\二叉树的先序遍历\bitree_preorder.c(48)   :   error   C2059:   syntax   error   :   'type'  
  D:\my   c   source   file\二叉树的先序遍历\bitree_preorder.c(126)   :   error   C2061:   syntax   error   :   identifier   'printnode'  
  D:\my   c   source   file\二叉树的先序遍历\bitree_preorder.c(126)   :   error   C2059:   syntax   error   :   ';'  
  D:\my   c   source   file\二叉树的先序遍历\bitree_preorder.c(126)   :   error   C2059:   syntax   error   :   'type'  
  D:\my   c   source   file\二叉树的先序遍历\bitree_preorder.c(136)   :   error   C2061:   syntax   error   :   identifier   'preorder'  
  D:\my   c   source   file\二叉树的先序遍历\bitree_preorder.c(136)   :   error   C2059:   syntax   error   :   ';'  
  D:\my   c   source   file\二叉树的先序遍历\bitree_preorder.c(136)   :   error   C2059:   syntax   error   :   'type'  
  D:\my   c   source   file\二叉树的先序遍历\bitree_preorder.c(195)   :   warning   C4013:   'preorder'   undefined;   assuming   extern   returning   int  
  D:\my   c   source   file\二叉树的先序遍历\bitree_preorder.c(195)   :   error   C2065:   'printnode'   :   undeclared   identifier  
  Error   executing   cl.exe.  
   
  bitree_preorder.obj   -   16   error(s),   1   warning(s)  
   
   
  问题出在哪里?怎么修改源程序呢?  
  问题点数:50、回复次数:9Top

1 楼kobefly(科比--网络学习中)回复于 2005-04-02 14:28:05 得分 50

楼主  
   
  你的程序有问题嘛?  
  我怎么看不出来  
   
  在我的vc6+xp  
  下无任何问题,没有warning  
  运行结果一切ok  
   
  函数指针使用也没有问题啊Top

2 楼tanchao1983()回复于 2005-04-02 14:33:06 得分 0

我的也是VC6+XP!  
  真的是有问题!  
  Top

3 楼kobefly(科比--网络学习中)回复于 2005-04-02 14:40:05 得分 0

那你的是不是.c文件  
   
  你在前边加一句  
  #define   bool   int  
   
  看看怎么样?Top

4 楼kobefly(科比--网络学习中)回复于 2005-04-02 14:44:43 得分 0

肯定是的  
   
  因为c中没有bool这个类型  
   
  如果你是.cpp文件就不会有这个问题了  
   
  在你前边加上边这句宏应该也可以解决你的问题  
   
  不是函数指针的问题Top

5 楼ycom__net(一恒)回复于 2005-04-02 14:58:29 得分 0

dev   C++   中也没问题呀  
   
  Top

6 楼ycom__net(一恒)回复于 2005-04-02 14:59:45 得分 0

同意科比的看法Top

7 楼xunknown(爱你是我一生中理想)回复于 2005-04-02 15:04:09 得分 0

没有错误啊!  
  你是不是没有包含头文件。  
  你看我运行的结果:  
   
  请输入二叉树的原始数组(0表示结束):  
  1  
  2  
  3  
  4  
  5  
  6  
   
  77  
  8  
  9  
  0575  
  56  
  4433  
  0  
  先序遍历二叉树:  
  1   2   3   4   5   6   77   8   9   56   575   4433  
  Press   any   key   to   continue  
  Top

8 楼shine51151(美丽心情)回复于 2005-04-02 15:09:08 得分 0

RE:   kobefly(科比---开始学习c++!)    
   
  果然是高手   这都能知道,我服了!!  
   
  就是你说的这个原因,我试过了,连报的错都和楼主给出的一模一样  
   
  把文件后缀改为*.cpp应该就ok了!  
   
  Top

9 楼tanchao1983()回复于 2005-04-02 15:25:10 得分 0

谢谢kobefly(科比---开始学习c++!)  
  源文件中要加三个宏定义:  
  #define   bool   int  
  #define   true   1  
  #define   false   0  
   
  就可以了.  
   
   
  Top

相关问题

  • TC++中的函数指针不能带参数?还是我的方法不对?
  • 求助:含有函数指针参数的函数模板
  • 函数模板问题(带一个函数指针参数)
  • (指针)一个指针作为函数参数的问题
  • 问一下关于指向函数的指针作函数参数的问题!!!!
  • 关于类成员函数中函数指针参数的问题!!
  • 非静态成员函数指针能做其他函数的参数吗
  • 函数指针作为参数的问题
  • 一个指针作为参数调用函数的问题
  • 如何传递成员函数指针参数

关键词

  • c++
  • 节点
  • 函数
  • 指针
  • 数据
  • 打印
  • root
  • bitree
  • 叉
  • 树

得分解答快速导航

  • 帖主:tanchao1983
  • kobefly

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo