现在我知道你在想什么 – 我在标题中描述的东西听起来就像重载一样.我知道这不是C中的事情,反正我也不会这样做.我有这两个函数 – 它们的身体绝对相同,但参数是两个不同的结构.基本上它是二叉搜索树结构和红黑树结构.您可能知道结构只有一个区别 – 红黑树结构包含一个字段,而这是一个颜色.还有函数search,min,max,predecessor,successor ……那些将具有完全相同的主体但是它们采用2种不同类型的结构.当然,插入和删除方法也会有所不同.
所以我在想如何避免打破编程中的头号规则而不重复自己?当我试图找到实现它的方法时,我想到了很多解决方案但没有工作.我想过只为两者使用一个函数,但我不能这样做,因为结构是不同的.我想过使用宏但老实说我不知道如何使这些工作,我甚至不确定他们可以避免我有2个不同的结构的问题.我想过制作一个通用结构并让rb结构包含它和一个颜色变量,但是这个直接改变代码到处都是几个字符因为我必须更深入到结构中以获得值而我不再拥有重复的代码.
只是问题的一个例子:
bst_search(bstTree t, char *k)
{
// Searching in tree
}
rb_search(rbTree t, char *k)
{
// SAME code for searching in tree
}
如果我在java中编码,我可能会使用抽象超类来解决这个问题,但是C没有像这样的花哨的东西.
一些额外的信息:两个实现都有自己的头文件和类文件,我想保持这种方式.现在我在这两个类中都有重复的代码,唯一不同的是函数和结构的名称(除了插入和删除函数ofc).
很抱歉,如果这有一个明显的解决方案,我只是没有找到解决方法而不重复我的代码.
最佳答案 如果您使用bstTree作为第一个成员创建rbTree:
typedef struct
{
bstTree common ;
int color ;
} rbTree
然后你可以安全地将rbTree转换为bstTree,因此rb_search()可以实现为一个简单的宏:
#define rb_search(t, k) bst_search( (bstTree*)(t). k )
一个问题是,现在对于rbTree独有的任何代码,您必须通过公共成员访问大多数成员.然而,这并非完全必要;如果你没有用bstTree成员定义rbTree,但只是确保两者的定义与公共成员首先相同,并且顺序和类型相同,你就可以将其中一个定义到另一个并访问成员,只要相同的包装和对齐选项适用于使用该结构的所有模块 – 但这样做的安全性较低,维护较少.一种有点丑陋但更安全的方法是将公共成员放在包含文件中,并在每个结构定义中包含#include成员.