dynamicArray.h
#ifndef _DYNAMICARRAY_H_
#define _DYNAMICARRAY_H_
#define _CRT_SECURE_NO_WARNINGS
#include
#include
#include
struct dynamicArray
{
void **pAddr; //维护在堆区真实数组指针
int m_capacity;//数组容量
int m_size; //数组大小
};
struct Person
{
char name[64];
int age;
};
//申请数组空间
struct dynamicArray *init_DynamicArray(int capacity);
//插入功能
void insert_dynamicArray(struct dynamicArray *array, int pos, void *data);
//遍历功能
void foreach_DynamicArray(struct dynamicArray *array, void(*myPrintPerson)(void*));
//删除功能
void removeByPos_DynamicArray(struct dynamicArray *arr, int pos);//按位置
void removeByValue_DynamicArray(struct dynamicArray *arr, void *data, int(*compaperPerson)(void*, void*));//按数据删除
//销毁数组
void destory_DynamicArray(struct dynamicArray *arr);
//-----------自定义测试数据----------------
void myPrintPerson(void * data);
int compaperPerson(void *data1, void *data2);
#endif
dynamicArray.c
#include "dynamicArray.h"
//申请数组空间
struct dynamicArray *init_DynamicArray(int capacity)
{
if (capacity <= 0)
return NULL;
struct dynamicArray *array = malloc(sizeof(struct dynamicArray));
//判断内存是否申请成功
if (array == NULL)
return NULL;
//设置容量
array->m_capacity = capacity;
//设置大小
array->m_size = 0;
//维护在堆区数组的指针
array->pAddr = malloc(sizeof(void*)*array->m_capacity);
return array;
}
//插入功能
void insert_dynamicArray(struct dynamicArray *array, int pos, void *data)
{
if (array == NULL)
return;
if (data == NULL)
return;
if (pos < 0 || pos > array->m_size)
{
//无效位置 尾部插入
pos = array->m_size;
}
//先判断数组大小是否满载 否则进行动态开辟内存
if (array->m_size >= array->m_capacity)
{
//1.申请更大的空间
int new_Capacity = array->m_capacity * 2;
//2.创建新空间
void ** new_Space = malloc(sizeof(void*)*new_Capacity);
//3.将原有数组拷贝到新空间下
memcpy(new_Space, array->pAddr, sizeof(void*)*array->m_capacity);
//4.释放原有空间
free(array->pAddr);
//5.更改指针指向
array->pAddr = new_Space;
//6.更新大小的容量
array->m_capacity = new_Capacity;
}
//插入新数据
//从最后一个位置开始 依次移动数据 后移
for (int i = array->m_size - 1; i >= pos; i--)
{
array->pAddr[i + 1] = array->pAddr[i];
}
//将新元素插入指定位置
array->pAddr[pos] = data;
//更新大小
array->m_size++;
return;
}
//遍历功能
void foreach_DynamicArray(struct dynamicArray *array, void(*myPrintPerson)(void*))
{
if (array == NULL)
return;
if (myPrintPerson == NULL)
return;
for (int i = 0; i < array->m_size; ++i)
{
myPrintPerson(array->pAddr[i]);
}
return;
}
//删除功能
void removeByPos_DynamicArray(struct dynamicArray *arr, int pos)
{
if (arr == NULL)
return;
if (pos < 0 || pos > arr->m_size - 1)
return;
for (int i = pos; i < arr->m_size - 1; ++i)
{
arr->pAddr[i] = arr->pAddr[i + 1];
}
arr->m_size--;
return;
}
void removeByValue_DynamicArray(struct dynamicArray *arr, void *data, int(*compaperPerson)(void*, void*))
{
if (arr == NULL || data == NULL)
return;
for (int i = 0; i < arr->m_size; ++i)
{
if (compaperPerson(arr->pAddr[i], data))
{
removeByPos_DynamicArray(arr, i);
break;
}
}
return;
}
//销毁数组
void destory_DynamicArray(struct dynamicArray *arr)
{
if (arr == NULL)
return;
if (arr->pAddr != NULL)
{
free(arr->pAddr);
arr->pAddr = NULL;
}
free(arr);
return;
}
void myPrintPerson(void * data)
{
struct Person *p = data;
printf("姓名:%s 年龄:%dn", p->name, p->age);
return;
}
int compaperPerson(void *data1, void *data2)
{
struct Person *p1 = data1;
struct Person *p2 = data2;
return strcmp(p1->name, p2->name) == 0 && p1->age == p2->age;
}
main.c
#include "dynamicArray.h"
void test01()
{
struct dynamicArray * arr = init_DynamicArray(5);
struct Person p1 = { "亚瑟", 18 };
struct Person p2 = { "王昭君", 28 };
struct Person p3 = { "赵云", 38 };
struct Person p4 = { "张飞", 19 };
struct Person p5 = { "关羽", 20 };
struct Person p6 = { "宫本", 25 };
printf("容量:%d 大小:%dn", arr->m_capacity, arr->m_size);
insert_dynamicArray(arr, 0, &p1);
insert_dynamicArray(arr, 0, &p2);
insert_dynamicArray(arr, 0, &p3);
insert_dynamicArray(arr, 2, &p4);
insert_dynamicArray(arr, 10, &p5);
insert_dynamicArray(arr, 1, &p6);
// 赵云 宫本 王昭君 张飞 亚瑟 关羽
foreach_DynamicArray(arr, myPrintPerson);
printf("容量:%d 大小:%dn", arr->m_capacity, arr->m_size);
removeByPos_DynamicArray(arr, 2);
foreach_DynamicArray(arr, myPrintPerson);
printf("容量:%d 大小:%dn", arr->m_capacity, arr->m_size);
struct Person p = { "张飞", 19 };
removeByValue_DynamicArray(arr, &p, compaperPerson);
foreach_DynamicArray(arr, myPrintPerson);
destory_DynamicArray(arr);
arr = NULL;
}
int main(int argc, char* argv[])
{
test01();
system("pause");
return EXIT_SUCCESS;
}
测试结果: