要使您的列表数据结构抽象化,只需将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,此时它会停止。该函数的实现知道如何访问 anode_ll
因为它在源文件中具有完整的定义struct node_ll
。
while (node) {
if (visit(visit_data, node->data)) {
node = node->next;
continue;
}
break;
}