目录
最后,如果这篇文章对你有所启发或者没什么启发那么就点点赞,收收藏,转转发,你们的支持就是我前进的动力(一个赞一道题),下次再见。
一.动态数组:
动态数组首要的是动态,而且为了这个数组能够适配任意类型,所以我们这里使用的是void*型的指针数组来存放数据的指针,通过指针来访问各种类型的数组。er
typedef struct x
{
void** ptr;//指向void*类型的数组的指针
int capacity;//数组的容量大小
int num;//数组元素的个数
}D_array;
二.动态数组的初始化
首先申请一块空间,并且让ptr指向那块空间,然后将容量和数组元素个数进行初始化。
D_array* inti_data(int capacity)//初始化动态数组,返回的是array的指针
{
D_array* array = (D_array*)malloc(sizeof(D_array));
if (array == NULL)//如果开辟空间失败就返回空指针
return NULL;
array->ptr = (void**)malloc(sizeof(void*) * capacity);//申请一片空间,用于存放数据的地址
if (array->ptr == NULL)//判断是否为空
return NULL;
array->capacity = capacity;
array->num = 0;
return array;
}
三:动态数组的数据插入:
这里使用的方法是按位置插入,所以当给定的位置不合理时就会退出函数,
如果数组的大小已经不够的话就要对数组进行扩容
如果给定的位置大于现在数组有的元素个数,那么我们可以实行尾插,如果不是尾插,那么就要向后移动元素,给目的空间腾出一个位置来插入数据。
void insert_data(D_array* array, int pos, void* data)
{
if (pos < 0)
{
printf("位置错误\n");
return;
}
if (array->capacity == array->num)//扩容操作
{
int newcapacity = array->capacity + plus_capacity;
void** newspace = (void**)malloc(sizeof(void*) * newcapacity);
if (newspace == NULL)
{
printf("扩容失败\n");
return;
}
memcpy(newspace, array->ptr, sizeof(void*) * array->capacity);
free(array->ptr);//释放掉原来的