estructuras de datos genéricos en C

votos
2

Estoy buscando en la creación de una BST genérico. No hay nada de fantasía COTS, pero estoy tratando de decidir la mejor manera de no perder de vista el tipo del vacío *. Esta es la unión de los nodos:

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

Sin embargo, cuando escribo añadir / quitar, voy a tener que hacer comparaciones, por lo tanto, voy a tener que llevar un registro de los tipos de datos que los datos hace referencia, ¿verdad?

La idea básica es tener una NODE_TYPE enumeración y una función compareTreeNodes que recibe los dos TreeNodes y la enumeración como una tercera arg. Esto permitiría a la función para determinar qué emitir el void * a.

Cualquier otro mejores pensamientos /?

Publicado el 14/10/2010 a las 14:35
fuente por usuario
En otros idiomas...                            


2 respuestas

votos
4

Sin embargo, cuando escribo añadir / quitar, voy a tener que hacer comparaciones, por lo tanto, voy a tener que llevar un registro de los tipos de datos que los "datos" hace referencia, ¿verdad?

Mira cómo qsort()resuelve este problema. Es, también, tiene que trabajar en los tipos de datos arbitrarios. Básicamente, usted delega comparación con los usuarios, a través de un puntero de función.

Respondida el 14/10/2010 a las 14:38
fuente por usuario

votos
3

Asumo una sola BST tendrá sólo un tipo de datos en él. En ese caso, me gustaría hacer un encapsulado structque contiene un puntero al nodo raíz y un puntero a una función de comparación. El usuario de la BST tendría que proporcionar una función adecuada en la inicialización.

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

Por cierto, su primera línea probablemente debería ser typedef struct TreeNode {. Usted tiene un typdef'd anónima struct, sino que se refieren a una estructura etiquetada inexistente en el interior. Estas dos versiones trabajarían:

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

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

No se puede hacer auto-referencial en el anonimato structs.

Respondida el 14/10/2010 a las 14:42
fuente por usuario

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