1

我目前正在构建一个个人数据结构库,我意识到它们可以通过将其中的数据完全抽象为 void *. 所以假设我创建了一个链表

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 岁且名字为“约翰”的人?

4

1 回答 1

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,此时它会停止。该函数的实现知道如何访问 anode_ll因为它在源文件中具有完整的定义struct node_ll

while (node) {
    if (visit(visit_data, node->data)) {
        node = node->next;
        continue;
    }
    break;
}
于 2013-06-12T16:10:40.210 回答