实现一个支持动态扩容的数组

目的

实现一个支持动态扩容的数组

实现一个大小固定的有序数组,支持动态增删改操作

/*
 * 程序名: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;
}

运行结果

在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值