我目前正在做一个项目,需要使用一些链接列表。
我已经习惯了它们,但我真的不喜欢我需要重复我的代码。我的意思是这样的。
struct A {
struct A *prev;
struct A *next;
int i;
}
struct B {
struct B *prev;
struct B *next;
char *str;
}
如果我想创建一个函数,将一个元素添加到我喜欢的任何列表中,我需要做一些事情,如:
void add_A_element(struct A *list, struct A *new_element) { [...] }
void add_B_element(struct B *list, struct B *new_element) { [...] }
我的问题是,有没有办法让我的所有结构都只有一个函数?
我想知道我是否可以用其他的结构来实现,比如:
struct template {
struct template *prev;
struct template *next;
}
那么添加我的元素的函数就会是这样的。
void add_element(void *list, void *new_element)
{
struct template tmp_list = (struct template *)list;
struct template tmp_new_element = (struct template *)new_element;
for (struct template tmp = tmp_list; tmp != NULL; tmp = tmp->next) {
if (tmp->next == NULL) {
tmp->next = tmp_new_element;
tmp_new_element->prev = tmp;
break;
}
}
return;
}
因为我们修改的是相同的内存空间,我想这是可行的,但我想可能会发生一些意外的问题。我想知道在C语言中是否可以存在更像C++模板的东西。
任何帮助将是感激的。我想知道是否有类似于C++模板的东西可以在C语言中存在。
如果你想看的话,我有完整的C语言模板(宏)解决方案,最后有链接。同时,让我解释一下如何解决这个问题。
你应该使用 container_of
策略来抽象地遍历一个链接列表。
struct linked_list_head
{
struct linked_list_head * next;
struct linked_list_head * prev;
};
struct my_type {
...
struct linked_list_head head;
}
那么得到下一个的代码将是
struct linked_list_head next(struct linked_list_head * current) {
return current->next;
}
struct my_type next = container_of(next(¤t.head), struct my_type, head));
什么是 container_of
宏?
如果你想看看使用模板实现的完整解决方案,我得到了一个免费使用的解决方案(风险自负)。
该库。https:/github.comflplvfl-libblobmasterheaderslinked_list.h。
的用法。https:/github.comflplvfl-libblobmasterteststest_linked_list.cpp。