结构设计
在堆区申请一个存放指针的数组,数组中的指针指向的元素就是实际的数据。
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,66
AA,11
BB,22
CC,33
DD,44
EE,55
remove index = 1
FF,66
BB,22
CC,33
DD,44
EE,55
insert index = 6 AA
FF,66
BB,22
CC,33
DD,44
EE,55
AA,11