数据结构可以在C中完全抽象吗?

时间:2013-06-12 15:22:32

标签: c data-structures linked-list traversal abstraction

我目前正在建立一个数据结构的个人库,我意识到他们可能完全被抽象,因为其中的数据是无效的*。所以,让我们说我创建一个链表

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'?

1 个答案:

答案 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;
}