1 动态数组的实现
#include <stdlib.h>
#include <stdio.h>
#include <stddef.h>
#include <string.h>
typedef struct dynamicArry_st
{
//真实在堆区开辟的数字的指针
void** pArry;
//容量大小
int m_Capcity;
//数组大小
int m_Size;
}dynamicArry;
//初始化数组
dynamicArry* init_dynamicArry(int capacity)
{
if (capacity == 0)
{
return NULL;
}
//开辟空间
dynamicArry* dynamic = (dynamicArry*)malloc(sizeof(dynamicArry));
if (dynamic == NULL)
{
return NULL;
}
//开辟成员的空间
void** parry = (void**)malloc(sizeof(void*) * capacity);
if (parry == NULL)
{
return NULL;
}
dynamic->pArry = parry;
//初始化
dynamic->m_Capcity = capacity;
dynamic->m_Size = 0;
return dynamic;
}
//插入数组
void insert_dynamicArray(dynamicArry* arr, void* data, int index)
{
if (arr == NULL)
{
return;
}
if (data == NULL)
{
return;
}
//判断数组是否满了
if (arr->m_Capcity == arr->m_Size)
{
//1.计算新内存空间大小
int newCapacity = arr->m_Capcity * 2;
//2.开辟空间
void** newArr = (void**)malloc(sizeof(void*) * newCapacity);
//3.将原空间的内容拷贝到新空间下
memcpy(newArr, arr->pArry, sizeof(void*) * (arr->m_Capcity));
//4.释放空间
free(arr->pArry);
//5.更改指针指向
arr->pArry = newArr;
//6.更新容量
arr->m_Capcity = newCapacity;
}
if (index < 0 || index > arr->m_Size)
{
//尾插
index = arr->m_Size;
}
//将元素插入指定位置
for (int i = arr->m_Size; i > index; i--)
{
arr->pArry[i] = arr->pArry[i - 1];
}
arr->pArry[index] = data;
//更新大小
arr->m_Size++;
}
//遍历
void foreach(dynamicArry* arr, void(*sshow)(void*))
{
if (arr == NULL)
{
return;
}
for (int i = 0; i < arr->m_Size; i++)
{
sshow(arr->pArry[i]);
}
}
//用户
//测试动态数组
typedef struct Person_st
{
char name[64];
int age;
}person;
//回调函数 打印数据
void sshow(void* data)
{
person* p = (person*)data;
printf("姓名:%s,年龄:%d\n", p->name, p->age);
}
//删除数组
//按照位置删除数据
void removeSet(dynamicArry* arr, int pos)
{
if (arr == NULL)
{
return;
}
if (pos < 0 || pos >= arr->m_Size)
{
return;
}
for (int i = pos; i < arr->m_Size - 1; i++)
{
arr->pArry[i] = arr->pArry[i + 1];
}
arr->m_Size--;
}
int compare(void* data1, void* data2)
{
person* p1 = (person*)data1;
person* p2 = (person*)data2;
if (strcmp(p1->name, p2->name) ==0 && (p1->age == p2->age))
{
return 0;
}
return 1;
}
//按值删除数据
void removeData(dynamicArry* arr, void* data,int(*compare)(void*,void*))
{
if (arr == NULL)
{
return;
}
if (data == NULL)
{
return;
}
person* p = (person*)data;
for (int i = 0; i < arr->m_Size; i++)
{
if (compare(arr->pArry[i], data) == 0)
{
removeSet(arr, i);
break;
}
}
}
void test01()
{
//初始化数组
dynamicArry* dynamic = init_dynamicArry(5);
printf("插入前 容量为%d,大小为%d\n", dynamic->m_Capcity, dynamic->m_Size);
//插入数据
person p1 = { "小阿",18 };
person p2 = { "小东",14 };
person p3 = { "小哈",11 };
person p4 = { "小干",13 };
person p5 = { "小嘎",12 };
person p6 = { "小学",19 };
insert_dynamicArray(dynamic, &p1, 0);
insert_dynamicArray(dynamic, &p2, 4);
insert_dynamicArray(dynamic, &p3, 2);
insert_dynamicArray(dynamic, &p4, 5);
insert_dynamicArray(dynamic, &p5, 6);
insert_dynamicArray(dynamic, &p6, 7);
printf("插入后 容量为%d,大小为%d\n", dynamic->m_Capcity, dynamic->m_Size);
//遍历
foreach(dynamic, sshow);
//按位置删除
removeSet(dynamic, 2);
printf("--------------\n");
foreach(dynamic, sshow);
printf("--------------\n");
//按值删除
removeData(dynamic, &p5,compare);
foreach(dynamic, sshow);
}
int main()
{
test01();
}