Generické datové struktury v C

hlasů
2

Dívám se do vytvoření generické BST. Nic vymyšleného NE Dětská, ale snažím se rozhodnout, nejlepší způsob, jak udržet přehled o typu void *. Zde je rozhraní pro uzly:

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

Nicméně, když píšu přidat / odebrat, budu muset udělat srovnání, a proto budu muset sledovat typu dat, že „data“ odkazuje, že jo?

Základní myšlenkou je, že má výčtu NODE_TYPE a funkci compareTreeNodes který obdrží dva TreeNodes a výčet jako 3rd arg. To by umožnilo funkce určit, co odevzdat void * k.

Jakákoliv jiná / lepší myšlenky?

Položena 14/10/2010 v 14:35
zdroj uživatelem
V jiných jazycích...                            


2 odpovědí

hlasů
4

Nicméně, když píšu přidat / odebrat, budu muset udělat srovnání, a proto budu muset sledovat typu dat, že „data“ odkazuje, že jo?

Podívejte se, jak qsort()řeší tento problém. Je také potřeba pracovat na libovolných datových typů. Zjednodušeně řečeno, budete delegovat srovnání uživatelům, a to prostřednictvím ukazatel funkce.

Odpovězeno 14/10/2010 v 14:38
zdroj uživatelem

hlasů
3

Předpokládám, že jediná BST bude mít pouze jeden typ dat v něm. V tom případě by se zapouzdřování struct, který obsahuje ukazatel na kořenový uzel a ukazatel na funkce porovnání. Uživatel vašeho BST by měl poskytnout vhodnou funkci při inicializaci.

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

Btw, by pravděpodobně měla být vaše první linie typedef struct TreeNode {. Máte typdef'd anonymní struct, ale odkazují na neexistující značeného struct dovnitř. Tyto dvě verze bude fungovat:

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

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

Nemůžete dělat sebereferenční anonymní structs.

Odpovězeno 14/10/2010 v 14:42
zdroj uživatelem

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