结构设计
在堆区申请一个存放指针的数组,数组中的指针指向的元素就是实际的数据。
typedef struct {void** pArray;int length;int size;} DynamicArray;
初始化
初始化开辟一个结构体来记录动态数组的信息,之后我们通过结构体来使用和观察动态数组,利用 void* 来接受任意数据的指针。
DynamicArray* init(int length) {if (length <= 0) return NULL;DynamicArray* array = (DynamicArray*)malloc(sizeof(DynamicArray));if (array == NULL) return NULL;array->pArray = (void**)malloc(sizeof(void*) * length);if (array->pArray == NULL) return NULL;array->length = length;array->size = 0;return array;}
插入
void insert(DynamicArray* array, void* data, int index) {if (array == NULL) return;if (data == NULL) return;if (index < 0 || index >(array->size)) index = array->size;if (array->size >= array->length) {int newLength = array->length * 2;void** newpArray = (void**)malloc(sizeof(void*) * newLength);if (newpArray == NULL) return;memcpy(newpArray, array->pArray, sizeof(void*) * array->length);free(array->pArray);array->pArray = newpArray;array->length = newLength;}for (int i = array->size - 1; i >= index; i--) {array->pArray[i + 1] = array->pArray[i];}array->pArray[index] = data;array->size += 1;}
遍历
对数组的每个元素执行一遍 callback 函数
void travel(DynamicArray * array, void callback(void*)) {if (array == NULL)return;for (int i = 0; i < array->size; i++) {callback(array->pArray[i]);}}
写 callback 函数时,要对 data 进行类型转换,转换为数组元素的类型。
void myPrintf(void* data) {Persion* persion = (Persion*)data;printf("%s,%d\n", persion->name, persion->age);}
删除
void remove(DynamicArray* array, int index) {if (array == NULL) return;if (index < 0 || index > array->size) return;for (int i = index; i < array->size; i++) {array->pArray[i] = array->pArray[i + 1];}array->size -= 1;}
销毁
内部真实数据如果是在堆区建立的话那么由用户 travel 释放。不释放使用者建立的数据。
void destory(DynamicArray* array) {if (array == NULL) return;if (array->pArray != NULL) {free(array->pArray);array->pArray = NULL;}free(array);array = NULL;}
测试
typedef struct {char name[64];int age;} Persion;void myPrintf(void* data) {Persion* persion = (Persion*)data;printf("%s,%d\n", persion->name, persion->age);}int main() {DynamicArray * arr = init(2);Persion p1 = {"AA", 11};Persion p2 = { "BB", 22 };Persion p3 = { "CC", 33 };Persion p4 = { "DD", 44 };Persion p5 = { "EE", 55 };Persion p6 = { "FF", 66 };insert(arr, &p1, 0);insert(arr, &p2, 1);insert(arr, &p3, 2);insert(arr, &p4, 3);insert(arr, &p5, 4);insert(arr, &p6, 0);travel(arr, myPrintf);puts("remove index = 1");remove(arr, 1);travel(arr, myPrintf);puts("insert index = 6 AA");insert(arr, &p1, 6);travel(arr, myPrintf);}
FF,66AA,11BB,22CC,33DD,44EE,55remove index = 1FF,66BB,22CC,33DD,44EE,55insert index = 6 AAFF,66BB,22CC,33DD,44EE,55AA,11
