手撕c++动态数组--Array

手撕c++动态数组--Array,第1张

话不多说,直接上代码,本次项目申请与释放内存借助于c语言的malloc与free函数,而不用c++的new与delete:
动态数组的头文件DynamicArray.h

#ifndef DYNAMICARRAY_H
#define DYNAMICARRAY_H	

#include 
#include 
#include 
typedef struct Array_Dynamic {	//定义动态链表
	int size;//数组长度
	int capacity;//容量
	int* ptrAdd;//数组地址
};
//初始化链表
Array_Dynamic* init_Array();

//尾插元素
void push_back(Array_Dynamic* array, int value);

//按位置删除元素
bool deleteElem_pos(Array_Dynamic* array, int pos);

//按值删除元素
bool deleteElem_value(Array_Dynamic* array, int value);

//按照位置查找某个元素
int findElem_pos(Array_Dynamic* array, int pos);

//按照值查找某个元素	,并且返回其元素位置,返回-1表示找不到
int findElem_value(Array_Dynamic* array, int value);

//打印元素
void print(Array_Dynamic* array);

//获取链表的容量
int getcapacity(Array_Dynamic* array);

//获取链表的大小
int getSize(Array_Dynamic* array);

//获取链表的首元素
int getFrontElem(Array_Dynamic* array);

//释放动态数组内存
void freeArray(Array_Dynamic* array);
#endif

动态数组的源文件DynamicArray.cpp

#include "DynamicArray.h"

Array_Dynamic* init_Array()
{
	Array_Dynamic* array_dynamic = (Array_Dynamic*)malloc(sizeof(Array_Dynamic));
	array_dynamic->capacity = 20;
	array_dynamic->size = 0;
	array_dynamic->ptrAdd =(int*) malloc (sizeof(int) * array_dynamic->capacity);
	return array_dynamic;
}

void push_back(Array_Dynamic* array, int value)
{
	if (array==NULL)
	{
		return ;
	}
	if (array->size==array->capacity)  //需要扩容,一般为原来的两倍
	{

		//申请更大的内存空间
		int* expandSpace = (int*)malloc(array->capacity * sizeof(int));
		//拷贝到新空间,最后一个为拷贝多大
		memcpy(expandSpace, array->ptrAdd, array->capacity * sizeof(int));
		//释放原空间
		free(array->ptrAdd);
		//更新
		array->capacity = array->capacity * 2;
		array->ptrAdd = expandSpace;
	}
	array->ptrAdd[array->size] = value;
	++array->size;
}

bool deleteElem_pos(Array_Dynamic* array, int pos)
{
	if (array==NULL||array->ptrAdd==NULL)
	{
		return false;
	}
	for (int i=pos;i<array->size-1;i++)
	{
		array->ptrAdd[i] = array->ptrAdd[i + 1];
	}
	array->size--;//更新大小
	return true;
}

bool deleteElem_value(Array_Dynamic* array, int value)
{
	if (array == NULL || array->ptrAdd == NULL)
	{
		return false;
	}

	//先查找是否有该元素
	int pos = findElem_value(array, value);
	if (pos ==-1)
	{
		return false;
	}
	deleteElem_pos(array, pos);
	return true;
}

int findElem_pos(Array_Dynamic* array, int pos)
{
	if (array==nullptr||array->ptrAdd==nullptr)
	{
		return 0;
	}
	if (pos>array->size-1||pos<0)
	{
		return 0;
	}
	return array->ptrAdd[pos - 1];
	
}

int findElem_value(Array_Dynamic* array, int value)
{
	if (array == nullptr || array->ptrAdd == nullptr)
	{
		return -1;
	}
	for (int i=0;i<array->size;++i)
	{
		if (value==array->ptrAdd[i])
		{
			return i;
			break;
		}
	}
	return -1;

}

void print(Array_Dynamic* array)
{
	if (array==nullptr||array->ptrAdd==NULL)
	{
		return;
	}
	for (int i=0;i<array->size;++i)	
	{
		std::cout << array->ptrAdd[i] << " ";
	}
	std::cout << std::endl;
}

int getcapacity(Array_Dynamic* array)
{
	if (array == nullptr)
	{
		return 0;
	}
	else
		return array->capacity;
}

int getSize(Array_Dynamic* array)
{
	return array->size;
}

int getFrontElem(Array_Dynamic* array)
{
	if (array->ptrAdd == nullptr || array == nullptr)
		return 0;
	else
		return array->ptrAdd[0];
}

void freeArray(Array_Dynamic* array)
{
	if (array==NULL)
	{
		return ;
	}
	if (array->ptrAdd!=NULL)
	{
		free(array->ptrAdd);
	}
	free(array);
}

主函数:

#include 
#include "DynamicArray.h"
#include 
void test()
{
	std::vector<int>vec = { 1,2,3,4,5,6,7,22,33,44,55,100 };
	//建立链表同时初始化
	Array_Dynamic *array = init_Array();
	//尾插元素
	for (auto it:vec)
	{
		push_back(array, it);
	}
	print(array);

	//获取元素数目
	std::cout << "the number elems:" << getSize(array)<<std::endl;
	//获取容量
	std::cout << "the capacity of array:" << getcapacity(array)<<std::endl;
	//输出首元素
	std::cout << "首元素:" << getFrontElem(array) << std::endl;

	//查找第四个元素
	if (findElem_value(array,3))
	{
		std::cout << "第四个元素为:" << findElem_pos(array, 3) << std::endl;
	}
	else
	{
		std::cout << "无该元素" << std::endl;
	}

	//查找55
	if (findElem_value(array,55))
	{
		std::cout << "第" << findElem_value(array, 55) + 1 <<"元素为"<<55<< std::endl;
	}

	//删除第二个元素
	deleteElem_pos(array, 1);
	std::cout << "删除第二个元素后:";
	print(array);

	//删除值为44的元素
	deleteElem_value(array, 44);
	std::cout << "删除44后:";
	print(array);

	//释放动态数组
	freeArray(array);

}

int main()
{
	test();
	std::system("pause");
	return 0;
}

输出结果:

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1498851.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-25
下一篇 2022-06-25

发表评论

登录后才能评论

评论列表(0条)

保存