Как удалить структуру в программировании c, которая имеет функции-члены в следующей структуре? - PullRequest
0 голосов
/ 07 декабря 2018

Я могу создать все перечисленные ниже функции и выполнить все операции, но я не могу удалить это дерево, поэтому, пожалуйста, кто-нибудь поможет мне, как я могу удалить структуру этого типа

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 голосов
/ 07 декабря 2018

По крайней мере, необычно помещать функции в структуру языка Си.Поскольку C не будет автоматически передавать указатель this, вам придется использовать что-то вроде

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

. Обычно оно используется только для реализации виртуальных функций, что означает, что функция может зависетьдля объекта, который является очень необычным случаем использования - он обычно зависит от группы объектов, и из-за этого у объекта есть только указатель на vTable, который является своего рода массивом функций.

Как говорится в C, правило таково: сначала уничтожить членов, затем освободить объект, поэтому здесь, если это может быть более или менее

void delete(Tree &tree) {
    // destroy and free descendants of root
    ...
    // destroy and free root
    ...
    free(tree);
}
0 голосов
/ 07 декабря 2018

Похоже, вы пытаетесь эмулировать классы в C ....

В любом случае,

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

Тот, кто получает указатель bsttemp (вызывающий функцию newTree ()), может просто вызватьfree () для этого указателя.

Кстати, не применяйте malloc ().Это не нужно и может скрывать ошибки в версиях до C99.

...