C语言静态数组常常接触,因为静态数组简单好用,使用动态数组不如使用链表,动态数组处境尴尬。
静态数组:
int a[32]={0}
动态数组:可以动态增加空间,但静态数组不能。
动态数组结构体。
struct dynamicArray
{
void** addr;
//在堆区开辟数组
int capacity;
//数组容量
int Size;
//数组大小(指的是数组中元素的个数)
};
初始动态数组的容量。
struct dynamicArray* initArray(int Capacity) {
if (Capacity <= 0) {
return;
}
struct dynamicArray* arr = malloc(sizeof(struct dynamicArray));
//申请结构体指针
if (arr)
{
//arr不为空
arr->capacity = Capacity;
arr->Size = 0;
arr->addr = malloc(sizeof(void*) * Capacity);
}
else
{
printf("fail\n");
return;
}
return arr;
}
向动态数组中插入数据。
//插入数据(data)向数组(arr)中的某一个位置(pos)
void insertArray(struct dynamicArray* arr, int pos, void* data) {
if (arr) {
if (pos<0 || pos>arr->Size)
{
//无效位置,强制尾插
pos = arr->Size;
}
}
if (data == NULL)
{
}
if (arr) {
if (arr->capacity == arr->Size)
{
//如果满空间,申请新空间
int newCapacity = arr->capacity * 2;
void** newSpace = malloc(sizeof(void*) * newCapacity);
//把原空间,拷贝新空间
if (newSpace)
{
memcpy(newSpace, arr->addr, sizeof(void*) * arr->capacity);
//释放原空间
free(arr->addr);
//指向新空间
arr->addr = newSpace;
arr->capacity = newCapacity;
//更新容量
}
}
//插入数据到指定位置
for (int i = arr->Size - 1; i >= pos; i--)
{
arr->addr[i + 1] = arr->addr[i];
}
arr->addr[pos] = data;
arr->Size++;//更新大小
}
}
完整代码:
链接:https://pan.baidu.com/s/1D-KYLNDsr9D4vWdVF5u-ww
提取码:kr6w