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

数据结构可以用C完全抽象吗?,c,data-structures,linked-list,traversal,abstraction,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 *he

我目前正在建立一个个人的数据结构库,我意识到,如果其中的数据是空的,它们可能会被完全抽象。假设我创建了一个链表

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”的人?

要使列表数据结构抽象,只需在源文件中隐藏
节点结构的定义即可。头文件将仅包含转发声明和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\u traverse\u until()
函数基本上会在每个节点上调用提供的
visit()
函数,除非
visit()
返回0,在该点停止。函数的实现知道如何访问
节点,因为它在源文件中具有
结构节点的完整定义

while (node) {
    if (visit(visit_data, node->data)) {
        node = node->next;
        continue;
    }
    break;
}

这是可能的,但很容易出错。看一看,上面提到的书不容易理解。可能还会传递一个函数指针,该指针将处理
void*
指向的数据类型。这是可能的,但您会失去类型安全性。你最好远离C并查看C++的标准模板库,或者更好地在Haskell中启动程序。@ BrayOLIVER,可以使它类型安全。“阿明可能,但是你同意其他建议吗?”所以基本上我有一个structure.h文件,它定义了数据结构类型的原型,我在每个实现中定义了该数据结构,并且在该实现中还定义了一个遍历方法?您不必在头文件中完全定义该结构,只要所有API只使用指向转发声明的指针(指针是完整类型)。源文件(即
.c
文件)包含详细说明的结构定义(包含
数据
下一个
成员,正如您在文章中所看到的),以便API的实现可以访问这些成员。您知道任何在线完整的工作示例进一步说明这一点吗?不适用于链表,但有一种方法使用了这种想法。不透明数据类型通常非常常见。UNIX文件描述符概念本质上是一种不透明类型。