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

tanchao1983 2005-04-02 02:22:11
// 程序说明:
// 根据输入的二叉树原始数组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)


问题出在哪里?怎么修改源程序呢?
...全文
580 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
tanchao1983 2005-04-02
  • 打赏
  • 举报
回复
谢谢kobefly(科比---开始学习c++!)
源文件中要加三个宏定义:
#define bool int
#define true 1
#define false 0

就可以了.


shine51151 2005-04-02
  • 打赏
  • 举报
回复
RE: kobefly(科比---开始学习c++!)

果然是高手 这都能知道,我服了!!

就是你说的这个原因,我试过了,连报的错都和楼主给出的一模一样

把文件后缀改为*.cpp应该就ok了!

xunknown 2005-04-02
  • 打赏
  • 举报
回复
没有错误啊!
你是不是没有包含头文件。
你看我运行的结果:

请输入二叉树的原始数组(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
ycom__net 2005-04-02
  • 打赏
  • 举报
回复
同意科比的看法
ycom__net 2005-04-02
  • 打赏
  • 举报
回复
dev C++ 中也没问题呀

kobefly 2005-04-02
  • 打赏
  • 举报
回复
肯定是的

因为c中没有bool这个类型

如果你是.cpp文件就不会有这个问题了

在你前边加上边这句宏应该也可以解决你的问题

不是函数指针的问题
kobefly 2005-04-02
  • 打赏
  • 举报
回复
那你的是不是.c文件

你在前边加一句
#define bool int

看看怎么样?
tanchao1983 2005-04-02
  • 打赏
  • 举报
回复
我的也是VC6+XP!
真的是有问题!
kobefly 2005-04-02
  • 打赏
  • 举报
回复
楼主

你的程序有问题嘛?
我怎么看不出来

在我的vc6+xp
下无任何问题,没有warning
运行结果一切ok

函数指针使用也没有问题啊

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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