一.数组结构体定义
#define ARRAY_SIZE 50
typedef struct
{
int data[ARRAY_SIZE];
int len;
}MyArray;其中,
ARRAY_SIZE表示数组的最大长度
len表示数组的当前长度,其实也可以表示为数组最后一个元素的下标(last),没有多大区别,凭个人喜好。
二. 初始化操作
void ArrayInit(MyArray *arr)
{
int i;
for (i = 0; i < ARRAY_SIZE; ++i)
{
arr->data[i] = 0;
}
arr->len = 0;
}初始化有两个步骤,一是将数组中所有元素初始化为0,因为在C语言中定义一个数组时不是将所有元素初始化为0,而是保留原先存储空间中的值,所以要进行初始化;
二是将数组长度置为0(定义为末尾元素下标时可置为-1,表示没有元素)。
三. 在数组末尾追加元素
int ArrayAppend(MyArray *arr, int var)
{
if(arr->len == ARRAY_SIZE)
{
//数组已满,无法添加元素
return -1;
}
arr->data[arr->len++] = var;
return 0;
}
往数组中添加元素时,需要检查数组是否已满,只有没满的时候才可以插入元素,插入元素后长度+1。
四. 在指定位置插入元素
int ArrayInsert(MyArray *arr, int var, int index)
{
if(arr->len >= ARRAY_SIZE)
{
//数组已满,无法插入元素
return -1;
}
if (index < 0 && index >= ARRAY_SIZE)
{
//指定的位置超出数组下标范围
return -1;
}
if (index >= arr->len)
{
arr->data[index] = var;
arr->len = index + 1;
}
else
{
int i;
for (i = arr->len - 1; i >= index; i--)
{
arr->data[i + 1] = arr->data[i];
}
arr->data[index] = var;
arr->len++;
}
return 0;
}
指定的位置有两种合法的情况,一是在大于现有数组长度len与最大长度之间,此时插入的位置没有有效数据,可以直接插入,插入后数组长度变为指定插入位置+1;
二是在现有数组长度以内,此时需要将指定位置之后的元素都往后挪,空出位置来让新元素插入。
五.查找元素
int ArraySearch(MyArray arr, int var)
{
int i;
if (arr.len == 0)
{
//数组为空,无法查找
return -1;
}
for(i = 0; i < arr.len; i++)
{
if (var == arr.data[i])
{
break;
}
}
if (i >= arr.len)
{
//遍历完了整个数组,没有找到指定元素
return -1;
}
return i;//返回查找元素所在的下标
}
六. 获取指定下标的元素
int ArrayGetData(MyArray arr, int index)
{
if (index < 0 || index >= arr.len)
{
//指定下标超出范围
return -1;
}
return arr.data[index];
}
七. 删除指定位置的元素
int ArrayDelete(MyArray *arr, int index)
{
int i;
if (index < 0 || index >= arr->len)
{
//指定位置超出范围
return -1;
}
for (i = index; i < arr->len - 1; ++i)
{
arr->data[i] = arr->data[i + 1];
}
arr->len--;
return 0;
}
八. 打印数组
void ArrayDisplay(MyArray arr)
{
int i;
if(arr.len == 0)
{
//数组为空
return;
}
printf("[ ");
for(i = 0; i < arr.len; i++)
{
printf("%d ", arr.data[i]);
}
printf("]\n");
printf("当前数组长度 = %d\n", arr.len);
}
九. 示例
int main()
{
MyArray arr;
ArrayInit(&arr);
ArrayAppend(&arr, 2);
ArrayAppend(&arr, 8);
ArrayAppend(&arr, 5);
ArrayAppend(&arr, 2);
ArrayInsert(&arr, 6, 1);
ArrayInsert(&arr, 7, 1);
ArrayInsert(&arr, 4, 1);
ArrayInsert(&arr, 14, 1);
ArrayDisplay(arr);
ArrayDelete(&arr, 3);
ArrayDisplay(arr);
printf("搜索指定数据的位置 = %d\n", ArraySearch(arr, 5));
printf("获取指定位置的数据 = %d\n", ArrayGetData(arr, 2));
return 0;
}
输出结果如下:
[ 2 14 4 7 6 8 5 2 ]
当前数组长度 = 8
[ 2 14 4 6 8 5 2 ]
当前数组长度 = 7
搜索指定数据的位置 = 5
获取指定位置的数据 = 4