Общее datastructures в C

голоса
2

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

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

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

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

Любые другие / лучшие мысли?

Задан 14/10/2010 в 14:35
источник пользователем
На других языках...                            


2 ответов

голоса
4

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

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

Ответил 14/10/2010 в 14:38
источник пользователем

голоса
3

Я предполагаю , что один BST будет иметь только один тип данных в нем. В этом случае я хотел бы сделать Encapsulating , 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.

Ответил 14/10/2010 в 14:42
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more