C语言实现动态数组

发布时间:2024年01月15日

1.mj版本的动态数组

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define DEFAULT_CAPACITY 10
#define ELEMENT_NOT_FOUND -1
// 定义全局变量 
// 数组元素个数
int size = 0;
// 初始化动态数组
int* initArray(int capacity) {
	// 如果我自行提供了数组的容量 那么我就根据指定的参数容量来创建数组
	capacity = capacity > DEFAULT_CAPACITY ? capacity : DEFAULT_CAPACITY;
	int* array = (int*)(malloc(sizeof(int) * capacity));
	return array;
}
// 对数组进行扩容操作的方法
void ensureCapacity(int size, int* array) {
	// 首先获取旧数组的容量
	int oldCapacity = sizeof(array) / sizeof(array[0]);
	if (size <= oldCapacity)return;
	// 如果需要执行扩容操作的话 那么首先设置新数组的容量
	int newCapacity = oldCapacity + (oldCapacity >> 1);
	int* newArray = (int*)(malloc(sizeof(int) * newCapacity));
	// 将旧数组的所有元素统统拷贝到新数组中
	for (int i = 0; i < newCapacity; ++i) {
		newArray[i] = array[i];
	}
	// 然后让旧数组指向新数组
	array = newArray;
}
// 索引越界方法
void outOfBounds(int index) {
	printf("索引为%d 索引越界了", index);
}
// 边界检查
void rangeCheck(int index){
	if (index < 0 || index >= size)
		outOfBounds(index);
}
// 针对添加方法的边界检查
void rangeCheckForAdd(int index) {
	if (index < 0 || index > size)
		outOfBounds(index);
}
// 往动态数组的指定位置进行添加操作
void add(int index, int data, int* array) {
	// 首先对参数索引进行边界检查
	rangeCheckForAdd(index);
	// 接着判断是否需要进行扩容操作
	ensureCapacity(size + 1, array);
	// 由于待插入元素之后的所有元素都要从前往后移动 所以遍历的时候就从后往前进行遍历
	for (int i = size; i > index; i--) {
		array[i] = array[i - 1];
	}
	// 然后将待插入元素放置在指定位置处
	array[index] = data;
	// 更新动态数组的长度
	size++;
}
// 对动态数组进行删除操作
int delete(int index, int* array) {
	// 首先对参数索引进行边界检查
	rangeCheck(index);
	// 然后定义一个变量 用于保存待删除的元素
	int delete = array[index];
	// 由于需要将待删除元素后面所有的元素从后往前移动 所以说遍历的时候就从前往后进行遍历操作
	for (int i = index; i < size - 1; i++) {
		array[i] = array[i + 1];
	}
	// 更新动态数组长度
	size--;
	// 返回被删除的元素
	return delete;
}
// 获取指定元素的位置
int indexOf(int data, int* array) {
	for (int i = 0; i < size; ++i) {
		if (array[i] == data)return i;
	}
	// 如果循环过程中始终没有返回值的话 那么说明数组中不存在指定元素
	return ELEMENT_NOT_FOUND;
}
// 获取指定位置处的元素
int get(int index, int* array) {
	rangeCheck(index);
	return array[index];
}
// 重置指定位置处的元素
int set(int index, int newData, int* array) {
	rangeCheck(index);
	int data = array[index];
	array[index] = newData;
	return data;
}
// 清空元素
void clear(int* array) {
	free(array);
	size = 0;
}
// 判断指定数组中是否包含指定元素
bool contains(int data, int* array) {
	return indexOf(data, array) != ELEMENT_NOT_FOUND;
}
// 判断数组是否为空
bool isEmpty() {
	return size == 0;
}
// 获取数组长度
int getSize() {
	return size;
}
// 打印数组
void printArray(int* array) {
	for (int i = 0; i < size; ++i) {
		printf("%d ", array[i]);
	}
	printf("\n");
}
// 定义一个主函数
int main() {
	// 创建一个动态数组
	int* array = initArray(8);
	// 对数组进行添加操作
	add(0, 1, array);// 1
	add(0, 2, array);// 2 1
	add(0, 3, array);// 3 2 1
	printArray(array);// 3 2 1
	printf("%d\n", get(0, array));// 3
	printf("%d\n", set(0, 4, array));// 3
	printArray(array);// 4 2 1
	printf("%d\n", getSize());// 3
	delete(0, array);
	printArray(array);// 2 1
	printf("%d\n", isEmpty());// 0
	printf("%d\n", contains(2, array));// 1
	clear(array);
	printf("%d\n", getSize());// 0
}

测试可以通过 代码经得住考验

文章来源:https://blog.csdn.net/m0_71299382/article/details/135591571
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。