我从计算机科学的大学课程中获得了任务,根据给定的头文件构建二叉搜索树。 但是,我不太了解其中的功能,它是指针和结构的混合。
这是头文件:
#ifndef GENBST_H
#define GENBST_H
#include <stdio.h>
#include <stdlib.h>
typedef void* Elm;
typedef void* BST;
typedef void* BST_ROOT;
typedef enum {SUCEESS, OUT_OF_MEM, BAD_ARGS, FAILURE } Result;
BST_ROOT BSTCreate( Elm root_val, Elm (*create_elm)(),
void (*cpy_elm) (Elm,Elm),
int (*cmp_elm) (Elm, Elm),
void (*free_elm)(Elm) );
void BSTDestroy (BST_ROOT root);
Result BSTAddElement (BST_ROOT root, Elm node);
Result BSTRemoveElement (BST_ROOT root, Elm node);
Elm BSTFindElement (BST_ROOT root, Elm node);
#endif
你能帮我弄清楚每个功能的含义吗? 具体在BSTCreate函数?
答案 0 :(得分:0)
我无法对此给出完整的答案,但我希望这个解释会对你有所帮助。
首先,正如Magix的评论中所述,头文件中没有函数定义,但是,头文件为您提供了接口应该如何规范。它指定函数原型和变量类型,给定这些,您应该能够实现BST。
尝试写下算法,看看是否可以使用此标头中声明的所有原型来实现它。 说,有两行解释会很有帮助;)
让我们来看看每一个标题! 首先,您将获得树中的元素和BST的类型:
typedef void* Elm;
typedef void* BST;
typedef void* BST_ROOT;
然后enum指定您可以使用的某些返回类型的值:
typedef enum {
SUCCESS, // 0 (I corrected the spell)
OUT_OF_MEM, // 1
BAD_ARGS, // 2
FAILURE // 3
} Result;
在此您了解必须提供创建BST的功能。
BST_ROOT BSTCreate(
Elm root_val,
Elm (*create_elm)(),
void (*cpy_elm) (Elm,Elm),
int (*cmp_elm) (Elm, Elm),
void (*free_elm)(Elm) );
此功能必须使用其他四个功能:
Elm (*create_elm)(),
void (*cpy_elm) (Elm,Elm),
int (*cmp_elm) (Elm, Elm),
void (*free_elm)(Elm)
最后,您还应提供一组修改BST的功能:
void BSTDestroy (BST_ROOT root);
Result BSTAddElement (BST_ROOT root, Elm node);
Result BSTRemoveElement (BST_ROOT root, Elm node);
Elm BSTFindElement (BST_ROOT root, Elm node);
答案 1 :(得分:0)
这是类型泛型编程和ADT创建的半失败尝试(&#34;抽象数据类型&#34;)。 &#34;半失败&#34;因为过于慷慨地使用无效指针而没有类型安全。特别是,将指针隐藏在typedef后面是非常糟糕的做法。总之...
Elm
可能是指&#34; element&#34;,这是要存储在树中的实际数据。 root_val
显然会成为树的最高值。
其余参数是函数指针。它是一种类型的模板:函数必须具有指定的格式。
显然,您的目的是为您创建的每个树提供指向数据特定函数的指针。对于每种特定数据类型,然后可以以合适的方式实现这些功能。您可以为int
提供一组函数,为字符串等设置一组函数等。并为每种此类数据类型创建一种树。
create_elm
和free_elm
是用于创建/删除特定类型元素的函数的指针(与C ++中的构造函数/析构函数进行比较)。
cpy_elm
可能应该是复制特定元素的函数(与C ++中的重载赋值运算符进行比较)。
cmp_elm
是实际的比较函数,可能应该返回-1,0或1,具体取决于param1是否小于,等于或大于param2。看看如何使用C标准bsearch
函数,这个函数的含义将变得更加清晰。 SO上有很多例子。