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

How to delete a struct in c programming which has member functions in the following struct?

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

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;
}

看起来你试图在 C 中模拟 类....

总之,

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

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

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

至少将函数放在 C 结构中是不常见的。由于 C 不会自动传递 this 指针,因此您必须使用

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

它通常只用于实现虚拟函数,意思是这里的函数可以依赖于对象,这是非常不常见的用例 - 它通常依赖于一组对象,因此该对象只有一个指向 vTable 的指针,它是一种函数数组。

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

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