数据结构-2. 动态数组
动态数组设计
struct dynamicArray
{
void** pAddr; //维护真实在堆区创建的数组的指针
int m_capacity; //数组容量
int m_size; // 数组大小
};
数组初始化
struct dynamicArray * init_DynamicArry(int capacity)
{
if (capacity <= 0)
{
return NULL;
}
//给数组分配空间
struct dynamicArray * array = malloc(sizeof(struct dynamicArray));
if (array == NULL)
{
return NULL;
}
array->pAddr = malloc(sizeof(void * ) * capacity);
array->m_capacity = capacity;
array->m_size = 0;
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)
{
// 申请更大空间
int newCapacity = array->m_capacity * 2;
// 创建新空间
void ** newSpace = malloc(sizeof(void*) * newCapacity);
//将原有数据拷贝到新空间下
memcpy(newSpace, array->pAddr, sizeof(void*) * array->m_capacity);
//释放原有内存
free(array->pAddr);
//更新新空间指向
array->pAddr = newSpace;
//更新新容量
array->m_capacity = newCapacity;
}
//插入新元素
//移动元素 进行插入新元素
for (int i = array->m_size -1; i >= pos; i--)
{
// 数据向后移动
array->pAddr[i + 1] = array->pAddr[i];
}
// 将新元素插入到指定位置上
array->pAddr[pos] = data;
//更新大小
array->m_size++;
}
遍历数组
void myPrintPerson(void *data)
{
struct Person* p = data;
printf("姓名:%s 年龄:%d\n", p->name, p->age);
}
void foreach_DynamicArray(struct dynamicArray* array, void (*myPrint)(void*))
{
if (array == NULL)
{
return;
}
if (myPrint == NULL)
{
return;
}
for (int i = 0; i < array->m_size; i++)
{
myPrint(array->pAddr[i]);
}
}
删除-按位删除
void removeByPos_DynamicArray(struct dynamicArray * array , int pos)
{
// 有效性检测
if (NULL == array)
{
return;
}
if (pos < 0 || pos > array->m_size - 1)
{
return;
}
//删除,数据前移
for (int i = pos; i < array->m_size - 1; i++) {
array->pAddr[i] = array->pAddr[i + 1];
}
//更新数组大小
array->m_size--;
}
删除数据-按值删除
int myComparePerson(void *data1, void *data2)
{
struct Person * p1 = data1;
struct Person * p2 = data2;
return strcmp(p1->name, p2->name) == 0 && p1->age == p2->age;
}
void removeByValue_DynamicArray(struct dynamicArray* array, void* data, int(* myCompare)(void *, void *))
{
if (array == NULL)
{
return;
}
if (data == NULL)
{
return;
}
for (int i = 0; i < array->m_size; i++) {
if (myCompare(array->pAddr[i],data))
{
// 如果找到要删除的数据,i就是要删除的具体位置
removeByPos_DynamicArray(array, i);
break;
}
}
}
销毁数组
void destroy_DynamicArray(struct dynamicArray* array)
{
if (array == NULL)
{
return;
}
if (array->pAddr != NULL)
{
free(array->pAddr);
array->pAddr = NULL;
}
free(array);
array= NULL;
}
本文来自博客园,作者:ffff5,转载请注明原文链接:https://www.cnblogs.com/ffff5/p/18323708
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?