首先,我是一个初学者(还有很多东西需要学习)。在我的一个小型学校项目中,我为一个结构编写了一个堆栈。现在我有了一个稍微不同的结构,我也需要一个堆栈。我应该写另一个数据结构stack,还是尝试实现一些泛型编程……
你知道在C中有什么好的泛型编程策略(最终是在线资源)吗?我用过谷歌,但我没有找到任何令人满意的东西,因为大多数结果都是关于C++策略的。
谢谢!
后来的编辑:经过一些阅读和体验,最终我找到了两个解决我的问题的方法。我在这里记录了它们:http://andreinc.net/2010/09/30/generic-data-structures-in-c/。那篇文章可能有错误或不准确之处,但它总结了我到目前为止所知道的。
发布于 2009-12-26 19:40:02
寻找共性和创建抽象是程序员最有价值的技能之一。因为你还在学习,所以我建议你做以下事情:
(1)实现另一个结构的堆栈。是的,这是双重工作,但在你的阶段,每个工作程序都很重要。积累经验。
(2)比较两种方案。它们的共同点是什么?有哪些不同之处?您的目标是将常见的部分与不同的部分分开。这两组人的交流方式是什么?它们共有的部分放入系统的一部分(stack.h/stack.c),不同的部分放入各自的文件(account.h/c、person.h/c等)。合并它们的部分应该包含stack.h和参数化实体。
(3)尝试找到所有您知道的语言提供的实现抽象结构功能的可能方法。乍一看,似乎只有一种方法,但对于每个重要的问题,总会有几种方法。在堆栈的情况下,例如,使用标准C,你可以使用空指针,你可以使用预处理器宏,你应该查看标记粘贴,你可以使用函数指针和结构指针,等等。
(4)尽可能多地实现它们。再说一次,这是为了学习体验。C有很多陷阱,越早遇到它们越好。
(5)在枚举并实现了所有这些不同的方法之后,您应该对它们进行评估:哪种方法最容易使用?哪一个最容易实现?哪一个是最快的?哪一个最容易调试?
发布于 2009-12-26 19:31:53
对于产品代码,我通常更喜欢C++。即使您不打算全力以赴使用OO、泛型和元编程,您也可以将C++用作更好的C语言(在本例中,只是为了免费获得std::stack )。
如果你必须使用C,试着保持它的简单性,并根据你的特定环境做出实用的选择。例如,如果您确定您的堆栈有一定的限制,并且您保存的数据很简单,那么您的堆栈代码就可以像stack[tos++] = x;和return stack[--tos]一样简单,而不需要可重用的库。建议基于void*的库的答案在不同的情况下也是合适的。C++的std::stack基本上一劳永逸地解决了这个问题;C并没有给你带来那样的享受。
发布于 2009-12-26 19:37:56
我在这里用C写了一个泛型编程的例子,虽然它不是一种数据结构算法,但它可以给你一些关于这个主题的线索。我希望它能帮助你。
下面的算法是冒泡排序算法的一般实现。我使用空指针并将数据强制转换为字节级。此外,我还使用了一个外部比较函数,它是唯一知道排序数据类型的代码。该比较函数作为参数传递给排序算法。
另一个要点是,主算法需要知道正在操作的数据的字节大小,以便知道需要多少字节才能将该数据移动到数组中的新位置。它还创建了一个缓冲区来存储此数据的一个实例( bubleSort函数中的k变量)。
static int compare(void *menor, void *maior)
{
int *pMenor = (int *)menor;
int *pMaior = (int *)maior;
return ( *pMenor > *pMaior );
}
void bubleSort(void *base, int bWidth, int len, int (*func)(void *key, void *data))
{
int i, j;
char *k=0;
char *bPtr = (char *)base; //Points to the beginning of the array
char *pi, *pj;
k = (char *)malloc(bWidth); //Creates a new var with the size of the data type
if(!k)
return;
for(i = 0; i < len; i++)
{
pi = (bPtr + (i*bWidth));
for(j=i+1; j < len; j++)
{
pj = (bPtr+(j*bWidth));
if( func((void *)pi, (void *)pj) )
{
memcpy(k, pi, bWidth);
memcpy(pi,pj, bWidth);
memcpy(pj, k, bWidth);
}
}
}
free(k);
}
int main()
{
int vet[5] = {4, 1, 3, 5, 2};
bubleSort((void *)vet, sizeof(int), 5, compare);
return 0;
}https://stackoverflow.com/questions/1963169
复制相似问题