函数指针做参数的使用方法?
// 程序说明:
// 根据输入的二叉树原始数组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)
问题出在哪里?怎么修改源程序呢?