目的
实现一个支持动态扩容的数组
实现一个大小固定的有序数组,支持动态增删改操作
/*
* 程序名:array.c,此程序演示
* 实现一个支持动态扩容的数组;
* 实现一个大小固定的有序数组,支持动态增删改操作
* 作者:jack 日期:20210707
*/
#include <stdlib.h>
#include <stdio.h>
typedef int ElemType; // 自定义数据元素为整数。
struct array
{
int size; // 动态数组的大小
int used; // 动态数组已用的大小
ElemType *arr; // 动态数组的首地址
};
void alloc(struct array *array)
{
array->arr = (ElemType *)malloc(sizeof(ElemType) * array->size);
if (array->arr == NULL)
{
printf("分配内存失败。\n");
return;
}
}
// 打印数组中的元素
void Print(struct array *array)
{
if (array->arr == NULL)
return;
int ii;
for (ii = 0; ii < array->used; ii++)
{
//printf("[%02d] : %08d\n", ii, array->arr[ii]); // 数组
printf("[%02d] : %08d\n", ii, *(array->arr+ii)); // 指针
}
}
// 增加数组元素,返回新增加元素的下标。
int insert(struct array *array, ElemType elem)
{
int idx;
if (array->used >= array->size)
return -1;
for (idx = 0; idx < array->used; idx++)
{
if (array->arr[idx] > elem)
break;
}
if (idx < array->used)
{
memmove(&array->arr[idx + 1], &array->arr[idx],
(array->used - idx) * sizeof(ElemType));
}
array->arr[idx] = elem;
array->used++;
return idx;
}
// 删除数组元素
int delete(struct array *array, int idx)
{
if (idx < 0 || idx >= array->used)
return -1;
memmove(&array->arr[idx], &array->arr[idx + 1],
(array->used - idx - 1) * sizeof(ElemType));
array->used--;
return 0;
}
// 查询数组元素,返回查询元素的下标。
int search(struct array *array, int elem)
{
int idx;
for (idx = 0; idx < array->used; idx++) {
if (array->arr[idx] == elem)
return idx;
if (array->arr[idx] > elem)
return -1;
}
return -1;
}
int main()
{
int index; // 用于记录数组元素的下标
// 创建一个数组
struct array starray = { 10, 0, NULL };
// 分配堆内存
alloc(&starray);
// 测试
//printf("starray.arr=%p\n", starray.arr);
insert(&starray, 1);
insert(&starray, 3);
insert(&starray, 2);
insert(&starray, 6);
insert(&starray, 4);
insert(&starray, 9);
insert(&starray, 5);
printf("=== insert 1, 3, 2, 6, 4, 9, 5\n");
// 打印数组元素
Print(&starray);
index = search(&starray, 2);
printf("2 is at position %d\n", index);
index = search(&starray, 9);
printf("9 is at position %d\n", index);
printf("=== delete [6] element \n");
delete(&starray, 6);
Print(&starray);
printf("=== delete [0] element \n");
delete(&starray, 0);
Print(&starray);
return 0;
}