C语言中的泛型数据结构

C语言中的泛型数据结构,c,data-structures,binary-search-tree,cots,C,Data Structures,Binary Search Tree,Cots,我正在研究创建一个通用的BST。并没有什么特别的,并没有COTS,但我正在尝试确定跟踪这种类型的空白*的最佳方法。以下是节点的界面: typedef struct { void *data; struct TreeNode *left; struct TreeNode *right; } TreeNode; 但是,当我编写add/remove时,我需要进行比较,因此我需要跟踪“data”指向的数据类型,对吗 基本思想是拥有一个enum Node_类型和一个函数compar

我正在研究创建一个通用的BST。并没有什么特别的,并没有COTS,但我正在尝试确定跟踪这种类型的空白*的最佳方法。以下是节点的界面:

typedef struct
{
   void *data;
   struct TreeNode *left;
   struct TreeNode *right;  
} TreeNode;
但是,当我编写add/remove时,我需要进行比较,因此我需要跟踪“data”指向的数据类型,对吗

基本思想是拥有一个enum Node_类型和一个函数compareTreeNodes,它接收两个树节点和作为第三个参数的enum。这将允许函数确定将void*强制转换为什么

还有其他/更好的想法吗

但是,当我编写add/remove时,我需要进行比较,因此我需要跟踪“data”指向的数据类型,对吗


看看
qsort()
是如何解决这个问题的。它也需要处理任意数据类型。基本上,您可以通过函数指针将比较委托给用户

我假设单个BST中只有一种类型的数据。在这种情况下,我将创建一个封装的
struct
,其中包含一个指向根节点的指针和一个指向比较函数的指针。BST的用户必须在初始化时提供适当的功能

typedef struct {
    TreeNode *root;
    int (*compar)(const void *, const void *);
} Tree;
顺便说一句,您的第一行可能应该是
typedef struct TreeNode{
。您有一个typedef'd匿名
struct
,但里面引用了一个不存在的标记结构。 这两个版本将起作用:

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

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

你不能使自引用匿名
structs

我曾考虑过使用函数ptr。事实上,我正试图想出一种方法,如果它是受支持的数据类型,比如char*、int*、char*,那么用户可以简化使用。如果它是其他类型,例如结构,那么我将有一个addToBST(BST*、comparator*)函数。我认为唯一的节省是,如果用户总是创建char*BST,那么它允许更直观地调用add/remove/search,而无需传递第三个参数,如strcmp。(其中第一个是BST,第二个是要添加/删除/搜索的节点)这是个好主意。我已经有了一个实例化函数-我现在就让它接收一个比较函数。这将有助于我在下面的第二个答案中讨论的内容。我不希望调用方/用户每次调用add/remove/search/which时都传递一个比较函数。太棒了!我的typedef是正确的。如果我没有将struct预编译到e内部指针(左/右),我会有一个编译器错误。我的错误斜杠没问题。注释被删除。