在C语言开发中,标准库并没有提供像高级语言(如Python、Java)那样丰富的内置数据结构。因此,很多开发者需要自己动手实现C语言数据容器库,以便更高效地管理数据。本教程将带你从零开始,一步步构建一个简单但实用的通用数据容器库,涵盖动态数组和链表两种基础结构。

C语言本身不支持泛型,也没有标准的动态数组或链表。这意味着每次处理不同类型的集合时,你可能需要重复编写相似的逻辑。通过封装通用的C语言通用数据结构,你可以复用代码、减少错误,并提升开发效率。
动态数组是最常用的数据容器之一。它可以根据需要自动扩容,非常适合存储连续的数据。
我们使用 void* 指针来实现“泛型”效果,同时记录元素大小和数量。
// dynamic_array.h#ifndef DYNAMIC_ARRAY_H#define DYNAMIC_ARRAY_H#include <stdlib.h>#include <string.h>typedef struct { void* data; // 指向实际数据的指针 size_t size; // 当前元素个数 size_t capacity; // 容量(最大可容纳元素数) size_t elem_size; // 每个元素的字节大小} DynamicArray;// 初始化动态数组DynamicArray* da_create(size_t elem_size);// 释放内存void da_destroy(DynamicArray* arr);// 添加元素到末尾void da_push_back(DynamicArray* arr, const void* elem);// 获取指定索引的元素void* da_get(DynamicArray* arr, size_t index);#endif// dynamic_array.c#include "dynamic_array.h"#define INITIAL_CAPACITY 4DynamicArray* da_create(size_t elem_size) { DynamicArray* arr = malloc(sizeof(DynamicArray)); if (!arr) return NULL; arr->data = malloc(INITIAL_CAPACITY * elem_size); if (!arr->data) { free(arr); return NULL; } arr->size = 0; arr->capacity = INITIAL_CAPACITY; arr->elem_size = elem_size; return arr;}void da_destroy(DynamicArray* arr) { if (arr) { free(arr->data); free(arr); }}void da_push_back(DynamicArray* arr, const void* elem) { if (arr->size >= arr->capacity) { arr->capacity *= 2; arr->data = realloc(arr->data, arr->capacity * arr->elem_size); if (!arr->data) return; // 内存分配失败 } memcpy((char*)arr->data + arr->size * arr->elem_size, elem, arr->elem_size); arr->size++;}void* da_get(DynamicArray* arr, size_t index) { if (index >= arr->size) return NULL; return (char*)arr->data + index * arr->elem_size;}下面是一个使用示例,存储整数:
#include <stdio.h>#include "dynamic_array.h"int main() { DynamicArray* arr = da_create(sizeof(int)); int a = 10, b = 20, c = 30; da_push_back(arr, &a); da_push_back(arr, &b); da_push_back(arr, &c); for (size_t i = 0; i < arr->size; i++) { int* val = (int*)da_get(arr, i); printf("%d ", *val); } // 输出:10 20 30 da_destroy(arr); return 0;}除了动态数组,C语言链表实现也是常见需求。链表适合频繁插入/删除操作。
// linked_list.htypedef struct ListNode { void* data; struct ListNode* next;} ListNode;typedef struct { ListNode* head; size_t size; size_t elem_size;} LinkedList;LinkedList* ll_create(size_t elem_size);void ll_destroy(LinkedList* list);void ll_push_front(LinkedList* list, const void* data);void* ll_get(LinkedList* list, size_t index);实现细节略(与动态数组类似),重点在于理解如何用 void* 实现通用性。
通过本教程,你已经掌握了如何从零构建一个基础的C语言数据容器库。无论是C语言动态数组还是C语言链表实现,核心思想都是利用 void* 和元素大小参数来模拟泛型行为。
下一步,你可以尝试添加更多功能,比如排序、查找、迭代器等,逐步完善你的数据结构工具箱!
记住,良好的数据结构设计是高效C程序的基础。掌握这些技能,将大大提升你在系统编程、嵌入式开发等领域的竞争力。
本文由主机测评网于2025-12-14发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://vpshk.cn/2025127504.html