c++小白数据结构——————1动态数组

1.前言 

课程主要来自于b站,链接2-02 循环链表思路_哔哩哔哩_bilibili

用的是Visual studio2022版本,自己用c++敲出来的代码。

2.代码

代码主要分为三部分 

1.Dynamic_Array.h 头文件(建立在头文件中)

#pragma once
#include<iostream>
typedef struct DynamticArray {
	int* paddr;//存放数据的地址
	int size;  //数组的大小
	int capacity; //数组的容量
}Dynamtic_Array;

//初始化
DynamticArray* Init_Array();
//插入
void PushBack_Array(DynamticArray* arr, int value);
//根据位置删除
void RemoveByPos_Array(DynamticArray* arr, int pos);
//根据值删除
void RemoveByValue_Array(DynamticArray* arr, int value);
//根据数值查找
int FindValue_Array(DynamticArray* arr, int value);
//打印动态数组
void PrintArray(DynamticArray* arr);
//释放动态数组
void FreeSpace_Array(DynamticArray* arr);
//清空数组
void Clear_Array(DynamticArray* arr);
//获得动态数组的容量
int Capacity_Array(DynamticArray* arr);
//获得动态数组当前元素的个数
int Size_Array(DynamticArray* arr);
//根据位置获得某个元素的位置
int At_Array(DynamticArray* arr, int  pos);

2.Dynamic_Array.cpp(建立在源文件中)

#include"Dynamic_Array.h"
//初始化
DynamticArray* Init_Array()
{
	DynamticArray* myArray = new DynamticArray;
	myArray->size = 0;
	myArray->capacity = 20;
	myArray->paddr = new int[myArray->capacity];
	return myArray;
}
//插入
void PushBack_Array(DynamticArray* arr, int value)
{
	if (arr == NULL) {
		return;
	}
	if (arr->size == arr->capacity)
	{
		//申请空间,新空间是旧空间的两倍
		int* newSpace = new int[arr->capacity*2];
		//拷贝数据
		memcpy(newSpace, arr->paddr, arr->capacity * sizeof(int));
		//释放旧空间的内存
		delete arr->paddr;
		//更新容量
		arr->capacity = arr->capacity * 2;
		arr->paddr = newSpace;
	}
	//插入数据
	arr->paddr[arr->size] = value;
	arr->size++;
}
//根据位置删除
void RemoveByPos_Array(DynamticArray* arr, int pos)
{
	if (arr == NULL) {
		return;
	}
	//判断位置
	if (pos < 0 || pos >= arr->size)
	{
		std::cout << "删除的位置无效" << "\n" << std::endl;
		return;
	}
	//删除
	for (int i = pos; i < arr->size - 1; i++)
	{
		arr->paddr[i] = arr->paddr[i + 1];
	}
	arr->size--;
}
//根据值删除
void RemoveByValue_Array(DynamticArray* arr, int value)
{
	if (arr == NULL) {
		return;
	}
	//找到数值的位置
	int pos = -1;
	for (int i = 0; i < arr->size; i++)
	{
		if (arr->paddr[i] == value) {
			pos = i;
			break;
		}
	}
	//根据位置删除
	RemoveByPos_Array(arr, pos);
}
//根据数值查找
int FindValue_Array(DynamticArray* arr, int value)
{
	if (arr == NULL) {
		return -1;
	}
	int pos = -1;
	for (int i = 0; i < arr->size; i++)
	{
		if (arr->paddr[i] == value) {
			pos = i;
			break;
		}
	}
	return pos;
}
//打印动态数组
void PrintArray(DynamticArray* arr)
{
	if (arr == NULL) {
		return;
	}
	for (int i = 0; i < arr->size; i++) {
		std::cout << arr->paddr[i]<<" ";
	}
	std::cout << "\n" << std::endl;
}
//释放动态数组
void FreeSpace_Array(DynamticArray* arr)
{
	if (arr == NULL) {
		return;
	}
	if (arr->paddr != NULL) {
		delete[] arr->paddr;
	}
	delete arr;
}
//清空数组
void Clear_Array(DynamticArray* arr)
{
	if (arr == NULL) {
		return;
	}
	arr->capacity = 0;
}
//获得动态数组的容量
int Capacity_Array(DynamticArray* arr)
{
	if (arr == NULL) {
		return -1;
	}
	return arr->capacity;
}
//获得动态数组当前元素的个数
int Size_Array(DynamticArray* arr)
{
	if (arr == NULL) {
		return -1;
	}
	return arr->size;
}
//根据位置获得某个元素的数值
int At_Array(DynamticArray* arr,int  pos)
{
	if (arr == NULL) {
		return -1;
	}
	return arr->paddr[pos];
}

2.1 DynamticArray* Init_Array()

用new开辟空间,将数组刚开始的大小设置为0,数组的最大容量设置为20,开辟存放数据的地址空间,最后返回myArray

2.2  void PushBack_Array(DynamticArray* arr, int value)

判断arr是否空,防止初始化失败,当数组的大小达到容量的大小时候要对数组进行扩容,一般扩容都是扩成原来的二倍。申请新空间1,拷贝原数据,释放原来的空间,更新数据的容量与数据存放的地址

2.3  void RemoveByPos_Array(DynamticArray* arr, int pos)

注意:假如pos为1,那么就是在第二个位置删除。

删除完之后要把后面的数据全部往前移动。

删除完毕不要忘记将数组的大小size减小

2.4 void RemoveByValue_Array(DynamticArray* arr, int value)

这里偷懒了,找到数值所在位置,然后就可以调用2.3进行删除

2.5 int FindValue_Array(DynamticArray* arr, int value)

遍历的思想取寻找数值,找到数值之后用break跳出循环返回位置

2.6 void PrintArray(DynamticArray* arr)

同样遍历数组,将数值输出

2.7 void FreeSpace_Array(DynamticArray* arr)

注意delete[] arr->paddr中的[],最后释放arr,因为arr与paddr都是开辟出来的,所以不要忘记释放内存

2.8 void Clear_Array(DynamticArray* arr)

2.9 int Capacity_Array(DynamticArray* arr)

2.10 int Size_Array(DynamticArray* arr)

2.11 int At_Array(DynamticArray* arr,int  pos)

3.test.cpp(建立在源文件中)

#include"Dynamic_Array.h"
void test_Dynamtic_Array()
{
	//初始化动态数组
	DynamticArray* myArray = Init_Array();
	//打印容量
	std::cout << "初始化后数组的容量为" << Capacity_Array(myArray) << std::endl;
	//打印大小
	std::cout << "初始化后数组的大小为" << Size_Array(myArray) << std::endl;
	//插入元素
	for (int i = 0; i < 30; i++) {
		PushBack_Array(myArray, i);
	}
	//打印容量
	std::cout << "插入数值后数组的容量为" << Capacity_Array(myArray) << std::endl;
	//打印大小
	std::cout << "插入数值后数组的大小为" << Size_Array(myArray) << std::endl;
	//打印
	PrintArray(myArray);
	//删除
	RemoveByPos_Array(myArray, 0);
	RemoveByValue_Array(myArray, 29);
	//打印
	PrintArray(myArray);
	//查找位置
	int pos = FindValue_Array(myArray, 19);
	std::cout << "19的位置为: " << pos << std::endl;

	//释放
	FreeSpace_Array(myArray);
}
int main()
{
	test_Dynamtic_Array();
	return 0;
}

运行结果:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值