c - C、泛化函数参数的类型
问题描述
我正在为链表和树编写 ac 库,我正在寻找一种解决方案来概括这些库处理的数据类型,而不需要为我需要处理的每种类型创建一个列表/树库。
例如,我的列表库有以下功能:
/* list.h */
typedef int list_element; // <-- need to generalize that
struct list_node {
list_element value;
struct list_node* next;
};
typedef struct list_node list_node;
typedef struct list_node* list;
extern list list_cons(list_element d, list l)
然后是我的 list.c:
/* list.c */
#include <list.h>
list list_cons(list_element d, list l){
list m = malloc(sizeof(list_node));
m->value = element_copy(d);
m->next = l;
return m;
}
现在假设在我的主程序中我必须使用一个 int 列表和一个 double 列表,我应该创建 2 对文件,比如 list_float.c/.h 和 list_int.c/.h
还有一些list_element
可以是 struct并且需要像 copy/isLess/isEqual 这样的函数来比较自己我想在我的代码中写这样的东西:
/* main.c */
list_cons(void *data, list l);
data
指向我想要和内部的任何类型的指针在哪里list_cons
,element_copy
适用于我传递的任何类型的数据(显然我需要复制数据而不是指向数据的指针,void* 是我必须概括函数的参数类型的唯一想法)
解决方案
作为一般建议,您不应该认为这list_cons
是构造链表的唯一方法。有时malloc
只是不可用或用户想要在静态数组中预分配所有内容或想要使用自定义分配器或......
作为具体示例,您可以查看https://github.com/torvalds/linux/blob/master/include/linux/list.h。
如果您想要代码的其他许可证,请在 xBSD Unix 源中搜索数据结构实现。
一般的想法是你只需要一个链表结构来包含下一个/上一个和类似的字段,而不是限制用户使用你的类型名称。所有迭代和基本操作都被定义为预处理器宏,在它们之上您可以实现复杂的算法。
推荐阅读
- angular - 角度:为什么值更改(使用渲染器2)不会触发绑定到该的事件
- typescript - 共享自定义 NestJS 模块给出“不是当前处理模块的一部分”错误
- python - 子类未在 Python 2.x 中初始化父类
- python - 直方图给出了概率密度函数的奇怪值
- java - 如何在日志文本上将 OrderId 显示为 Log4j 模式布局
- android - 改造 - 处理刷新令牌过期
- ios - 更改语义内容属性后 UI 挂起
- android - Android - 单元测试以检查光标是否已关闭
- python - 如何修复“由于 EnvironmentError:HTTPSConnectionPool 无法安装软件包”错误?
- ruby-on-rails - 如何在 ruby 和 ruby on rails 中只允许使用 preg_replace 的数字字符