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;
}
运行结果: