《抽象数据类型:把数据和对数据的操作绑在一起》

《抽象数据类型:把数据和对数据的操作绑在一起》 前言C 语言是一门面向过程的语言没有 class 类但是我们可以利用头文件.h和源文件.c分离的写法模拟面向对象里的封装思想也就是抽象数据类型ADT。 所有数据结构统一使用这套规范编写代码整洁、复用性强也是大厂 C 语言项目的通用写法。一、什么是抽象数据类型 ADT抽象数据类型分为两部分数据本身用结构体保存需要存储的所有成员操作集合对数据的增删改查、初始化、销毁等函数。核心思想隐藏内部实现细节对外只提供接口。使用者不需要知道结构体内部如何实现只需要调用规定函数即可完成操作。二、C 语言实现 ADT头文件与源文件分离1. 头文件 list.h对外接口给使用者看头文件只放结构体声明、函数声明所有具体实现写在.c 文件中。// list.h #ifndef LIST_H #define LIST_H // 结构体类型声明对外隐藏具体成员 typedef struct List List; // 对外提供的接口函数 List* List_Init(); // 初始化 void List_Insert(List* list, int val); // 插入元素 void List_Delete(List* list, int val); // 删除元素 void List_Print(List* list); // 遍历打印 void List_Destroy(List* list); // 销毁内存 #endif2. 源文件 list.c具体实现内部隐藏// list.c #include list.h #include stdio.h #include stdlib.h // 完整结构体定义只在当前文件可见 struct List { int* data; int size; int capacity; }; List* List_Init() { List* list (List*)malloc(sizeof(List)); list-capacity 4; list-size 0; list-data (int*)malloc(sizeof(int) * list-capacity); return list; } void List_Insert(List* list, int val) { list-data[list-size] val; } void List_Print(List* list) { for(int i 0; i list-size; i) { printf(%d , list-data[i]); } } void List_Destroy(List* list) { free(list-data); free(list); } // 删除函数省略实现 void List_Delete(List* list, int val) { }3. 主函数 main.c使用者调用#include list.h int main() { // 用户完全不知道List结构体内部成员 List* L List_Init(); List_Insert(L, 10); List_Insert(L, 20); List_Print(L); List_Destroy(L); return 0; }三、封装带来的好处信息隐藏结构体具体成员只在.c 文件中可见外部无法随意修改结构体内部变量避免非法篡改数据保证数据安全。统一编码规范之后写链表、栈、队列、树全部沿用这套格式 结构体 typedef、Init 初始化接口、增删查改接口、Destroy 销毁接口代码风格高度统一。便于维护和迭代后续优化底层实现比如优化扩容逻辑、优化查找算法只需要修改 list.c 文件外部调用代码一行不用改动。方便打包复用编译成静态库其他人只需要拿到.h 头文件和库文件就能直接使用数据结构不用关心底层代码。四、总结抽象数据类型就是 C 语言里的 “面向对象封装”。 结构体存放属性一系列函数作为方法头文件暴露接口源文件隐藏实现。 这是学习所有数据结构之前必须掌握的编码规范熟练之后后续手写任意数据结构都会顺手很多。