首页 > 解决方案 > 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_conselement_copy适用于我传递的任何类型的数据(显然我需要复制数据而不是指向数据的指针,void* 是我必须概括函数的参数类型的唯一想法)

标签: c

解决方案


作为一般建议,您不应该认为这list_cons是构造链表的唯一方法。有时malloc只是不可用或用户想要在静态数组中预分配所有内容或想要使用自定义分配器或......

作为具体示例,您可以查看https://github.com/torvalds/linux/blob/master/include/linux/list.h

如果您想要代码的其他许可证,请在 xBSD Unix 源中搜索数据结构实现。

一般的想法是你只需要一个链表结构来包含下一个/上一个和类似的字段,而不是限制用户使用你的类型名称。所有迭代和基本操作都被定义为预处理器宏,在它们之上您可以实现复杂的算法。


推荐阅读