我目前正在建立一个数据结构的个人库,我意识到他们可能完全被抽象,因为其中的数据是无效的*。所以,让我们说我创建一个链表
typedef struct node_ll {
void *data;
struct node_ll *next;
} node_ll;
让我们说我正在创建一个结构链表,它们被定义为
struct person {
char *name;
int age;
};
然后,是否可以定义抽象搜索方法
void *traverse(void *head, void* data) {}
找一个19岁的人并且名字叫' John'?
答案 0 :(得分:2)
要使列表数据结构变得抽象,只需隐藏源文件中node_ll
结构的定义即可。头文件只包含前向声明和API的原型:
typedef struct node_ll node_ll;
typedef struct linkedlist { node_ll *head; } linkedlist;
static inline linkedlist make_linkedlist () {
const linkedlist zero_ll = { 0 };
return zero_ll;
}
void unmake_linkedlist (linkedlist *list);
void linkedlist_add (linkedlist *list, void *data);
void linkedlist_traverse_until (linkedlist *list,
int (*visit)(void *visit_data, void *data),
void *visit_data);
linkedlist_traverse_until()
函数基本上会在每个节点上调用提供的visit()
函数,除非visit()
返回0,此时它将停止。该函数的实现知道如何访问node_ll
,因为它在源文件中具有struct node_ll
的完整定义。
while (node) {
if (visit(visit_data, node->data)) {
node = node->next;
continue;
}
break;
}