动态数组(也称为可变数组)是一种可以自动增长容量的数组。在某些编程语言中,数组的长度是固定的,如果需要添加新的元素,就需要创建一个新的数组。而在动态数组中,数组的长度可以根据需要自动增长,这样就避免了因数组容量不足而需要重新分配内存的情况。
动态数组的实现通常需要使用动态内存分配,这可能会导致内存使用效率低下。因此在某些情况下,使用静态数组(也称为固定数组)可能会更加高效。静态数组在初始化时确定数组的长度,如果在使用过程中需要添加新的元素,可以通过扩展数组来解决。
在实际编程中,应该根据具体需求和资源限制来选择使用动态数组还是静态数组。在需要频繁插入和删除元素的情况下,动态数组可能更加适合。而在性能要求较高的场景中,静态数组可能会更加高效。
接下来让我们看看我是如何实现的:
#ifndef ARRAY_H_
#define ARRAY_H_
#include <stdbool.h>
#define DataType int
#define INITMAXSIZE 10
struct _Array
{
DataType *arr;
int maxsize;
int length;
};
typedef struct _Array Array;
//扩大动态数组容量
bool Expand(Array *arr);
//减小动态数组容量
bool Shrink(Array *arr);
//创建动态数组
Array CreateArray(int maxsize);
//清空数组
void ClearArray(Array *arr);
//添加数据
void PushData(Array *arr,DataType value);
//插入数据
bool InsertData(Array *arr,int pos,DataType value);
//删除指定位置数据
bool DeleteData(Array *arr,int pos);
//修改数据
bool ChangeData(Array *arr,int pos,DataType newvalue);
//查找数据
int FindData(Array *arr,DataType value);
//获得数据
DataType GetData(Array *arr,int pos);
void PrintArray(Array *arr);
#endif /* ARRAY_H_ */
#include "Array.h"
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
// 扩大动态数组容量
bool Expand(Array *arr)
{
if (arr->maxsize == 0)
{
arr->arr = (DataType *)malloc(sizeof(DataType) * 10);
arr->maxsize = INITMAXSIZE;
}
else
{
arr->maxsize *= 2;
arr->arr = (DataType *)realloc(arr->arr, sizeof(DataType) * (arr->maxsize));
}
return true;
}
// 减小动态数组容量
bool Shrink(Array *arr)
{
if (arr->maxsize <= INITMAXSIZE || arr->length >= arr->maxsize / 2)
return false;
arr->maxsize /= 2;
arr->arr = (DataType *)realloc(arr->arr, sizeof(DataType) * (arr->maxsize));
return true;
}
Array CreateArray(int maxsize)
{
Array arr;
arr.maxsize = maxsize;
arr.length = 0;
if (maxsize > 0)
arr.arr = (DataType *)malloc(sizeof(DataType) * maxsize);
else
arr.arr = NULL;
printf("Array Created\n");
return arr;
}
void ClearArray(Array *arr)
{
arr->length = 0;
arr->maxsize = 0;
if (arr->arr != NULL)
{
free(arr->arr);
arr->arr = NULL;
}
}
void PushData(Array *arr, DataType value)
{
if (arr->length >= arr->maxsize)
{
Expand(arr);
}
arr->arr[arr->length++] = value;
}
bool InsertData(Array *arr, int pos, DataType value)
{
if (arr->length >= arr->maxsize)
{
Expand(arr);
}
if (pos < 0 || pos > arr->length)
return false;
for (int i = arr->length; i > pos; i--)
{
arr->arr[i] = arr->arr[i - 1];
}
arr->arr[pos] = value;
arr->length++;
return true;
}
bool DeleteData(Array *arr, int pos)
{
if (pos < 0 || pos >= arr->length)
return false;
for (int i = pos; i < arr->length - 1; i++)
{
arr->arr[i] = arr->arr[i + 1];
}
arr->length--;
if (arr->length < arr->maxsize / 4 && arr->maxsize > INITMAXSIZE)
{
Shrink(arr);
}
return true;
}
bool ChangeData(Array *arr, int pos, DataType newvalue)
{
if (pos < 0 || pos >= arr->length)
return false;
arr->arr[pos] = newvalue;
return true;
}
int FindData(Array *arr, DataType value)
{
for (int i = 0; i < arr->length; i++)
{
if (arr->arr[i] == value)
return i;
}
return false;
}
DataType GetData(Array *arr, int pos)
{
if (pos < 0 || pos >= arr->length)
return 0xFFFFFFFF;
return arr->arr[pos];
}
void PrintArray(Array *arr)
{
for (int i = 0; i < arr->length; i++){
printf("%-4d,", arr->arr[i]);
}
printf("\n");
}