ywrby

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

动态数组

[C++]STL-vector容器(动态数组)

头文件:DynamicArray.h

#ifndef  DYNAMIC_ARRAY_H  //防止头文件被重复调用
#define DYNAMIC_ARRAY_H
#include<stdio.h>
#include<stdlib.h>
#include<string.h>


//动态增长内存,所以将存放数据的内存放到堆上
//动态数组,如果内存不足,需要申请内存,拷贝数据,释放内存等一系列操作
//capacity容量 ,size元素个数




typedef struct DYNAMICARRAY {
	int* pAddr;  //存放数据的地址
	int size;  //当前元素个数
	int capacity;  //当前容量

}DYNAMIC_ARRAY;

//写一系列结构体操作函数
//初始化
DYNAMIC_ARRAY* DYNAMIC_ARRAY_INIT();
//插入
void Push_Back_Array(DYNAMIC_ARRAY*,int);
//删除
void RemoveByPos_Array(DYNAMIC_ARRAY*, int);  //根据位置删除
void RemoveByVal_Array(DYNAMIC_ARRAY*, int);  //根据值删除
//查找
int Find_Array(DYNAMIC_ARRAY*, int);
//打印数组
void Print_Array(DYNAMIC_ARRAY*);

//获得数组容量
int Capacity_Array(DYNAMIC_ARRAY*); 
//获得数组size
int Size_Array(DYNAMIC_ARRAY*);
//根据位置获取某个位置元素
int At_Arrray(DYNAMIC_ARRAY*,int);
//释放动态数组内存
void FreeSpace_Array(DYNAMIC_ARRAY*);
//清空数组
void Clear_Array(DYNAMIC_ARRAY*);

#endif DYNAMIC_ARRAY_H  // ! DYNAMIC_ARRAY_H

实现文件:DynamicArray.c

#include"DynamicArray.h"
#define CAPACITY 20



//初始化
DYNAMIC_ARRAY* DYNAMIC_ARRAY_INIT() {
	//先申请内存
	DYNAMIC_ARRAY* myarray = (DYNAMIC_ARRAY*)malloc(sizeof(DYNAMIC_ARRAY));
	//初始化
	myarray->size = 0;
	myarray->capacity = CAPACITY;
	myarray->pAddr =(int*) malloc(sizeof(int) * CAPACITY);
	return myarray;
}
//插入
void Push_Back_Array(DYNAMIC_ARRAY* arr, int val) {
	if (arr == NULL) {
		return;
	}
	//判断空间是否足够
	if (arr->size == arr->capacity) {
		//第一步:申请更大空间  ,默认申请2倍
		int* newSpace = (int*)malloc(sizeof(int) * arr->capacity * 2);
		//第二步:拷贝进新内存空间
		memcpy(newSpace, arr->pAddr, arr->capacity * sizeof(int));  //表示将第二个参数内容拷贝进第一个参数中,第三个参数表示拷贝的字节数
		//第三步:释放旧空间内存
		free(arr->pAddr);
		//更新容量
		arr->capacity *= 2;
		//更新指针
		arr->pAddr = newSpace;
	}
	//插入新元素
	arr->pAddr[arr->size] = val;
	//更新size
	arr->size ++;
}
//删除    
void RemoveByPos_Array(DYNAMIC_ARRAY* arr, int pos) {   //根据位置删除
	if (arr == NULL) {
		return;
	}
	//判断位置是否有效
	if (pos < 0 || pos >= arr->size) {
		return;
	}
	//删除元素
	for (int i = pos; i < arr->size-1; i++) {
		arr->pAddr[i] = arr->pAddr[i + 1];
	}
	arr->size--;

}
void RemoveByVal_Array(DYNAMIC_ARRAY* arr, int val) {   //根据值删除,第一次出现位置
	if (arr == NULL) {
		return;
	}
	//找到值的位置
	int pos = Find_Array(arr, val);
	//根据位置删除
	RemoveByPos_Array(arr, pos);
	
}
//查找
int Find_Array(DYNAMIC_ARRAY* arr, int val) {
	if (arr == NULL) {
		return -1;
	}
	for (int i = 0; i < arr->size; i++) {
		if (arr->pAddr[i] == val) {
			return i;
		}
	}
	return -1;
}
//打印数组
void Print_Array(DYNAMIC_ARRAY* arr) {
	for (int i = 0; i < arr->size; i++) {
		printf("%d  ", arr->pAddr[i]);
	}
	printf("\n");

}

//获得数组容量
int Capacity_Array(DYNAMIC_ARRAY* arr) {
	if (arr == NULL) {
		return -1;
	}
	return arr->capacity;
}
//获得数组size
int Size_Array(DYNAMIC_ARRAY* arr) {
	if (arr == NULL) {
		return -1;
	}
	return arr->size;
}
//根据位置获取某个位置元素
int At_Arrray(DYNAMIC_ARRAY* arr, int pos) {
	return arr->pAddr[pos];
}
//释放动态数组内存
void FreeSpace_Array(DYNAMIC_ARRAY* arr) {
	if (arr == NULL) {  //判断传入指针是否为空,防止多次释放内存
		return;
	}
	if (arr->pAddr != NULL) {  //先释放存放元素数据内存
		free(arr->pAddr);
	}
	free(arr);  //释放结构体内存

}
//清空数组
void Clear_Array(DYNAMIC_ARRAY* arr) {
	if (arr == NULL) {  //判断传入指针是否为空
		return;
	}
	arr->size = 0;  //令size=0,这样在下次写入数据时,便会覆盖原先部分,达到清空数组目的
}


主文件:Main.c

void DynamicArrayTest() {
	//创建动态数组
	DYNAMIC_ARRAY* myarray = DYNAMIC_ARRAY_INIT();
	//打印容量
	printf("初始化后容量为:%d\n元素个数为:%d\n", myarray->capacity,myarray->size);
	//插入元素
	for (int i = 0; i < 30; i++) {
		Push_Back_Array(myarray, i);
	}
	printf("插入元素后容量为:%d\n元素个数为:%d\n", myarray->capacity, myarray->size);
	//删除元素
	RemoveByPos_Array(myarray, 5);
	RemoveByVal_Array(myarray, 25);
	//查找元素
	int pos=Find_Array(myarray, 17);
	printf("%d位于:%d \n", At_Arrray(myarray, pos),pos);

	//打印数组
	Print_Array(myarray);
	//销毁数组
	FreeSpace_Array(myarray);
}

int main(){
    DynamicArrayTest();
    system("pause");
    return 0;
}

posted on 2020-03-04 08:06  ywrby  阅读(410)  评论(0)    收藏  举报