#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//动态数组结构体
struct dynamicArray
{
void** pAddr;
int m_capacity;
int m_size;
};
//初始化数组
struct dynamicArray* initDynamicArray(int capacity)
{
//1.判断输入容量
if (capacity <= 0)
{
return NULL;
}
//2.给数组结构体分配空间
struct dynamicArray* arry = (struct dynamicArray*) malloc(sizeof(struct dynamicArray));
if (arry == NULL)
{
return NULL;
}
//3.数组结构体属性初始化
arry->pAddr = (void**)malloc(sizeof(void*) * capacity);
arry->m_capacity = capacity;
arry->m_size = 0;
return arry;
}
//插入
void insertDynamicArray(struct dynamicArray* arry, int pos, void* data)
{
//1.判断输入参数的有效性
if (arry == NULL || data == NULL)
{
return ;
}
if (pos < 0 || pos > arry->m_size) //pos越界,默认尾插
{
pos = arry->m_size;
}
//2.判断数组是否已满,满了动态扩展
if (arry->m_size == arry->m_capacity)
{
int new_capacity = arry->m_capacity * 2; //新空间大小
void** new_space = (void**)malloc(sizeof(void*) * new_capacity); //开辟新空间
memcpy(new_space, arry->pAddr, sizeof(void*) * arry->m_capacity); //将原有数据拷贝到新空间
free(arry->pAddr); //释放原来空间
arry->pAddr = new_space; //指向新空间
arry->m_capacity = new_capacity; //更新容量
}
//3.pos位置后的元素向后移动一位,注意:从右向左移动方便
for (int i = arry->m_size - 1; i >= pos; i--)
{
arry->pAddr[i + 1] = arry->pAddr[i];
}
//4.插入
arry->pAddr[pos] = data;
arry->m_size++; //更新数组大小
}
//遍历数组
void foreachDynamicArray(struct dynamicArray* arry, void (*myPrint)(void*))
{
if (arry == NULL || myPrint == NULL)
{
return;
}
if (arry->m_size == 0)
{
return;
}
for (int i = 0; i < arry->m_size; i++)
{
myPrint(arry->pAddr[i]);
}
}
//按位置删除数组元素
void removeByPosDynamicArray(struct dynamicArray* arry, int pos)
{
//1.判断
if (arry == NULL)
{
return;
}
if (arry->m_size == 0)
{
return ;
}
if (pos < 0 || pos >= arry->m_size)
{
return;
}
//2. 删除, 向前覆盖
for (int i = pos; i < arry->m_size-1; i++) //删除最后一个元素直接m_size--即可
{
arry->pAddr[i] = arry->pAddr[i + 1];
}
//3.更新
arry->m_size--;
}
//按值删除
void removeByValueDynamicArray(struct dynamicArray* arry, void* data, bool(*myCompare)(void*, void*))
{
//1.判断
if (arry == NULL || data == NULL || myCompare == NULL)
{
return;
}
if (arry->m_size == 0)
{
return;
}
//2.删除
for (int i = 0; i < arry->m_size; i++)
{
if (myCompare(arry->pAddr[i], data))
{
//如果找到要删除的数据,i就是要删除的具体位置
removeByPosDynamicArray(arry, i);
break; //只删除第一次出现的
}
}
//3.更新,removeByPosDynamicArray中已经更新过了
}
//销毁数组
void destroyDynamicArray(struct dynamicArray* arry)
{
if (arry == NULL)
{
return;
}
//先销毁属性的指针,再销毁结构体指针
if (arry->pAddr != NULL)
{
free(arry->pAddr);
arry->pAddr = NULL;
}
free(arry);
arry = NULL;
}
//----------测试-----------
//自定义类型
struct Person
{
char name[64];
int age;
};
void myPrint(void* data)
{
struct Person* p = (struct Person*) data;
printf("姓名:%s ---- 年龄:%d\n", p->name, p->age);
}
bool myCompare(void* d1, void* d2)
{
struct Person* p1 = (struct Person*)d1;
struct Person* p2 = (struct Person*)d2;
return strcmp(p1->name, p2->name) == 0 && p1->age == p2->age;
}
int main()
{
struct dynamicArray* arry = initDynamicArray(5);
struct Person p1 = {"san", 11};
struct Person p2 = { "si", 22 };
struct Person p3 = { "wu", 33 };
struct Person p4 = { "wu", 33 };
insertDynamicArray(arry, 0, &p1);
insertDynamicArray(arry, 1, &p2);
insertDynamicArray(arry, 2, &p3);
insertDynamicArray(arry, 0, &p4);
foreachDynamicArray(arry, myPrint);
//removeByPosDynamicArray(arry, 2);
//foreachDynamicArray(arry, myPrint);
printf("------------\n");
struct Person p = { "wu", 33 };
removeByValueDynamicArray(arry, &p, myCompare);
foreachDynamicArray(arry, myPrint);
return 0;
}
数据结构----动态数组
于 2023-08-09 11:05:52 首次发布