Общие структуры данных в C - PullRequest
2 голосов
/ 14 октября 2010

Я изучаю создание общего BST.Ничего особенного, нет COTS, но я пытаюсь выбрать лучший способ отслеживать тип пустоты *.Вот интерфейс для узлов:

typedef struct
{
   void *data;
   struct TreeNode *left;
   struct TreeNode *right;  
} TreeNode;

Однако, когда я пишу добавить / удалить, мне нужно будет сделать сравнение, следовательно, мне нужно будет отслеживать тип данных, которые «данные»указывает на, верно?

Основная идея состоит в том, чтобы иметь перечисление Node_Type и функцию compareTreeNodes, которая получает два TreeNodes и перечисление как 3-й аргумент.Это позволило бы функции определить, к чему привести пустоту *.

Есть ли другие / лучшие мысли?

Ответы [ 2 ]

4 голосов
/ 14 октября 2010

Однако, когда я пишу добавить / удалить, мне нужно будет сделать сравнение, поэтому мне нужно будет отслеживать тип данных, на которые указывают «данные», верно?1003 *

Посмотрите, как qsort() решает эту проблему.Он также должен работать с произвольными типами данных.По сути, вы делегируете сравнение пользователям через указатель на функцию.

3 голосов
/ 14 октября 2010

Я предполагаю, что в одном BST будет только один тип данных. В этом случае я бы сделал инкапсуляцию struct, которая содержит указатель на корневой узел и указатель на функцию сравнения. Пользователь вашего BST должен будет предоставить подходящую функцию при инициализации.

typedef struct {
    TreeNode *root;
    int (*compar)(const void *, const void *);
} Tree;

Кстати, ваша первая строка, вероятно, должна быть typedef struct TreeNode {. У вас есть typdef'd анонимный struct, но вы ссылаетесь на несуществующую теговую структуру внутри. Эти две версии будут работать:

typedef struct TreeNode {
    void *data;
    struct TreeNode *left, *right;
} TreeNode;

typedef struct TreeNode TreeNode;
struct TreeNode {
    void *data;
    TreeNode *left, *right;
};

Вы не можете сделать анонимную ссылку на себя structs.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...