datastructures génériques en C

voix
2

Je suis à la recherche dans la création d'un BST générique. Rien d'extraordinaire COTS pas, mais je suis en train de décider de la meilleure façon de garder une trace du type du vide *. Voici l'interface pour les nœuds:

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

Cependant, quand j'écris ajouter / supprimer, je vais devoir faire des comparaisons, d'où je vais avoir besoin de garder une trace du type de données que les « données » pointe, non?

L'idée de base est d'avoir une NODE_TYPE enum et une compareTreeNodes fonction qui reçoit les deux TreeNodes et l'ENUM en tant que 3ème arg. Cela permettrait à la fonction de déterminer quoi le vide jeté * à.

Toute autre / meilleures pensées?

Créé 14/10/2010 à 14:35
source utilisateur
Dans d'autres langues...                            


2 réponses

voix
4

Cependant, quand j'écris ajouter / supprimer, je vais devoir faire des comparaisons, d'où je vais avoir besoin de garder une trace du type de données que les « données » pointe, non?

Regardez comment qsort()résout ce problème. Elle aussi, a besoin de travailler sur les types de données arbitraires. Fondamentalement, vous déléguez par rapport aux utilisateurs, via un pointeur de fonction.

Créé 14/10/2010 à 14:38
source utilisateur

voix
3

Je suppose un seul BST aura qu'un seul type de données qu'il contient . Dans ce cas , je ferais un encapsulage structqui contient un pointeur vers le nœud racine et un pointeur vers une fonction de comparaison. L'utilisateur de votre BST devrait fournir une fonction appropriée à l' initialisation.

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

BTW, votre première ligne devrait probablement être typedef struct TreeNode {. Vous avez un typdef'd anonyme struct, mais faites référence à une struct étiquetée inexistante à l' intérieur. Ces deux versions travailleraient:

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

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

Vous ne pouvez pas faire anonyme auto-référentiel structs.

Créé 14/10/2010 à 14:42
source utilisateur

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