数据结构可以用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文件描述符概念本质上是一种不透明类型。