- 论坛徽章:
- 0
|
satic void Inorder(const Node *root,void(*fun)(Item item))
{
if(root!=NULL)
{
Inorder(root->left,pfun);
(*pfun)(root->item);
Inorder(root->right,pfun);
}
}
我问题是这样的:
(*pfun)(root->item);这个函数具体是怎么实现的?我在下面接口函数文件中找不到?他的具体作用是用来处理树结点中的项目的(也即data)?
接口函数文件:
/*tree.c*/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include"tree.h"
#define true 1
#define false 0
typedef struct pair
{
Node *parent;
Node *child;
}Pair;
static Node *MakeNode(const Item *pi);
static int ToLeft(const Item *i1,const Item *i2);
static int ToRight(const Item *i1,const Item *i2);
static void AddNode(Node *new_node,Node *root);
static void Inorder(const Node *root,void (*pfun)(Item item));
static Pair SeekItem(const Item *pi,const Tree *ptree);
static void DeleteNode(Node **ptr);
static void DeleteAllNodes(Node *ptr);
void InitializeTree(Tree *ptree)
{
ptree->root=NULL;
ptree->size=0;
}
int TreeIsEmpty(const Tree *ptree)
{
if(ptree->root==NULL)
return true;
else
return false;
}
int TreeIsFull(const Tree *ptree)
{
if(ptree->size==MAXITEMS)
return true;
else
return false;
}
int TreeItemCount(const Tree *ptree)
{
return ptree->size;
}
int AddItem(const Item *pi,Tree *ptree)
{
Node *new_node;
if(TreeIsFull(ptree))
{
fprintf(stderr,"Tree is full\n");
return false;
}
if(SeekItem(pi,ptree).child!=NULL)
{
fprintf(stderr,"Attempted to add duplicate");
return false;
}
new_node=MakeNode(pi);
if(new_node==NULL)
{
fprintf(stderr,"Could't create node\n");
return false;
}
ptree->size++;
if(ptree->root==NULL)
ptree->root=new_node;
else
AddNode(new_node,ptree->root);
return true;
}
int InTree(const Item *pi,const Tree *ptree)
{
return (SeekItem(pi,ptree).child==NULL)?false:true;
}
int DeleteItem(const Item *pi,Tree *ptree)
{
Pair look;
look= SeekItem(pi,ptree);
if(look.child==NUll)
return false;
if(look.parent==NULL)
DeleteNode(&ptree->root);
else if(look.parent->left==look.child)
DeleteNode(&look.parent->left);
else
DeleteNode(&look.parent->right);
ptree->size--;
return true;
}
void Traverse(const Tree *ptree,void(*pfun)(Item item))
{
if(ptree!=NULL)
Inorder(ptree->root,pfun);
}
void DeleteALL(Tree *ptree)
{
if(ptree!=NULL)
DeleteAllNodes(ptree->root);
ptree->root=NULL;
ptree->size=0;
}
satic void Inorder(const Node *root,void(*fun)(Item item))
{
if(root!=NULL)
{
Inorder(root->left,pfun);
(*pfun)(root->item);
Inorder(root->right,pfun);
}
}
static void DeleteAllNodes(Node *root)
{
Node *pright;
if(root!=NULL)
{
pright=root->right;
DeleteAllNodes(root->left);
free(root);
DeleteAllNodes(pright);
}
}
static Node *MakeNode(const Item *pi)
{
Node *new_node;
new_node=(Node*)malloc(sizeof(Node));
if(new_node!=NULL)
{
new_node->item=*pi;
new_node->left=NULL;
new_node->right=NULL;
}
return new_node;
}
static void AddNode(Node *new_node,Node *root)
{
if(ToLeft(&new_node->item,&root->item))
{
if(root->left==NULL)
root->left=new_node;
else
AddNode(new_node,root->left);
}
else if(ToRight(&new_node->item,&item->item))
{
if(root->right==NULL)
root->right=new_node;
else
AddNode(new_node,root->right);
}
else
{
fprintf(stderr,"location error in AddNode()\n");
exit(1);
}
}
static int ToLeft(const Item *i1,const Item *i2)
{
int comp1;
if((comp1=strcomp(i1->petname,i2->petname))<0)
return true;
else if(comp1==0&&strcmp(i1->petkind,i2->petkind)<0)}
return true;
else
return false;
}
static int ToRight(const Item *i1,const Item *i2)
{
int comp1;
if((comp1=strcomp(i1->petname,i2->petname))>0)
return true;
else if(comp1==0&&strcmp(i1->petkind,i2->petkind)>0)}
return true;
else
return false;
}
static Pair SeekItem(const Item *pi,const Tree *ptree)
{
Pair look;
look.parent =NULL;
look.child =ptree->root;
if(look.child==NULL)
return look;
while(look.child!=NULL)
{
if(ToLeft(pi,&(look.child->item)))
{
look.parent =look.child;
look.child =look.child->left;
}
else(ToRight(pi,&(look.child->item)))
{
look.parent=look.child;
look.child=look.child->right;
}
else
break;
}
return look;
}
static void DeleteNode(Node **ptr)
{
Node *temp;
puts((*ptr)->item.petname);
if((*ptr)->left==NULL)
{
temp=*ptr;
*ptr=(*ptr)->right;
free(temp);
}
else if((*ptr)->right==NULL)
{
temp=*ptr;
*ptr=(*ptr)->left;
free(temp);
}
else
{
for(temp=(*ptr)->left;temp->right!=NULL;temp=temp->right)
continue;
temp->right=(*ptr)->right;
temp=*ptr;
*ptr=(*ptr)->left;
free(temp);
}
}
|
|