我能够创建下面的所有功能并执行所有操作,但是我无法删除此树,所以请有人帮我如何删除这种类型的结构
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;
}
答案 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);
}