/* 17-8-09-11-21.20.h -- 第十七章第八题 */ #ifndef LAST_H_ #define LAST_H_ #define ADD_AN_ITEM 1 #define SIZE 20 /* 定义数据类型 */ /* Name_And_Pet 暴露给用户的数据类型 */ typedef struct name_and_pet { char petname[SIZE] ; /* 宠物名 */ char petkind[SIZE] ; /* 宠物种类 */ } Name_And_Kind ; typedef struct item { Name_And_Kind name_and_kind ; struct item * next ; } Item ; typedef struct node { Item * item ; struct node * left ; struct node * right ; } Node ; typedef Node * Tree ; /* 接口函数声明 */ /* 操作: 把树初始化为空树 */ /* 操作前: ptree 指向一个树 */ /* 操作后: 该树被初始化为空树 */ void InatializeTree (Tree * const ptree) ; /* 操作: 确定树是否为空 */ /* 操作前: ptree 指向一个树 */ /* 操作后: 如果该树为空,返回1; 否则返回0 */ int TreeIsEmpty (const Tree * const ptree) ; /* 操作: 在树中添加一个项目 */ /* 操作前: pitem 指向待添加数据, ptree 指向一棵已初始化的二叉搜索树 */ /* 操作后: 如果可能, 将数据为 pitem 指向数据添加到树中, 可能是添加一个结点, 也可能是添加到结点的next指针上, 返回1; 否则返回0 */ int Insert (Tree * const ptree, const Name_And_Kind * const p_name_and_pet) ; /* 操作: 返回指向树中最左侧的结点的指针 */ /* 操作前: ptree 指向一棵已初始化的二叉搜索树 */ /* 操作后: 返回指向该树中最左侧结点的指针 */ Node * FindMin (const Tree * const ptree) ; /* 操作: 返回指向树中最右侧的结点的指针 */ /* 操作前: ptree 指向一棵已初始化的二叉搜索树 */ /* 操作后: 返回指向该树中最右侧结点的指针 */ Node * FindMax (const Tree * const ptree) ; /* 操作: 从树中删除一个具有指定Name_And_Kind类型的结点或Item类型数据 */ /* 操作前: ptree 指向一棵已初始化的二叉搜索树, p_name_and_kind 指向一个Item类型的数据 */ /* 操作后: 如果可能的话, 从树中删除具有 p_name_and_kind 指向数据的一个结点或者该结点指针指向的一个Name_And_Kind类型数据, 返回新树; 否则返回原树 */ Tree Delete (Tree * const ptree, Name_And_Kind * p_name_and_kind) ; /* 操作: 返回树中一个指向具有指定Name_And_Kind.petname类型数据的结点的指针 */ /* 操作前: tree 是一棵已初始化的二叉搜索树, p_name_and_kind 是一个指向Name_And_Kind类型数据的指针 */ /* 操作后: 如果可能, 返回指向该结点的指针; 否则返回NULL */ Node * SeekAndReturn (const Tree tree, const Name_And_Kind * const p_name_and_kind) ; /* 操作: 以中序访问树中的每一个项目 */ /* 操作前: ptree 指向一棵已初始化的二叉搜索树, pfun 指向一个没有返回值,接受一个指向 Item 指针类型值作为参数的函数 */ /* 操作后: pfun 指向的函数以中序作用到树中每一个节点一次 */ void InorderTraversal (const Tree * const ptree, void (* pfun) (const Item * const pitem)) ; /* 操作: 删除树中所有节点 */ /* 操作前: ptree 指向一棵已初始化的二叉搜索树 */ /* 操作后: 树中的所有节点被删除 */ //void DeleteAll (Tree * const ptree) ; #endif