我目前正在构建一个个人的数据结构库,我意识到它们可以通过让其中的数据为空*来完全抽象。假设我创建了一个链表
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岁的叫“约翰”的人?
发布于 2013-06-13 00:10:40
要使列表数据结构变得抽象,只需在源文件中隐藏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;
}https://stackoverflow.com/questions/17069294
复制相似问题