理解给定的头文件

时间:2016-01-12 12:29:10

标签: c pointers struct

我从计算机科学的大学课程中获得了任务,根据给定的头文件构建二叉搜索树。 但是,我不太了解其中的功能,它是指针和结构的混合。

这是头文件:

#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函数?

2 个答案:

答案 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_elmfree_elm是用于创建/删除特定类型元素的函数的指针(与C ++中的构造函数/析构函数进行比较)。

cpy_elm可能应该是复制特定元素的函数(与C ++中的重载赋值运算符进行比较)。

cmp_elm是实际的比较函数,可能应该返回-1,0或1,具体取决于param1是否小于,等于或大于param2。看看如何使用C标准bsearch函数,这个函数的含义将变得更加清晰。 SO上有很多例子。