如何在c编程中删除具有以下结构中的成员函数的结构?

时间:2018-12-07 03:49:48

标签: c struct binary-tree binary-search-tree

我能够创建下面的所有功能并执行所有操作,但是我无法删除此树,所以请有人帮我如何删除这种类型的结构

typedef struct Tree
{

Node *root;

Data *(*insert)(struct Tree *, Data);

Data *(*search)(struct Tree *bst, Data value);

void (*sort)(struct Tree *, Data *);

int (*compare)(struct Tree *t, struct Tree *copy);

struct Tree * (*clone)(struct Tree *t);

void (*delete)(struct Tree * bst);

void (*removeData)(struct Tree * bst, Data value);
}Tree;

树实例如下

Tree *newTree()
{

    Tree *bsttemp = (Tree *)malloc(sizeof(Tree));

    bsttemp->root = NULL;

    bsttemp->insert = &insert;

    bsttemp->search = &search;

    bsttemp->sort = &sort;

    bsttemp->compare = &compare;

    bsttemp->clone = &clone;

  //  bsttemp->delete = &delete;

    bsttemp->removeData = &removeData;

    return bsttemp;
}

2 个答案:

答案 0 :(得分:0)

看起来像您尝试在C中模拟类。

反正

console

无论谁获取bsttemp指针(newTree()函数的调用者)都可以对该指针简单地调用free()。​​

顺便说一句,不要转换malloc()。不必要,并且可以隐藏C99之前版本的C中的错误。

答案 1 :(得分:0)

至少将函数放入C结构中并不常见。由于C不会自动传递this指针,因此您将不得不使用

struct Tree *tree;
...
struct Tree *tree2 = tree->clone(tree);  // same as directly calling: clone(tree)

通常仅用于实现 virtual 函数,这意味着该函数可以取决于对象,这是非常罕见的用例-通常取决于一组对象,因此该对象只有一个指向vTable的指针,而vTable是一种函数数组。

在C语言中所说的规则是:首先销毁成员,然后释放对象,所以这里可能会更多或更少

void delete(Tree &tree) {
    // destroy and free descendants of root
    ...
    // destroy and free root
    ...
    free(tree);
}