动态数组的实现

DynamicArray.h

#ifndef UNTITLED_DYNAMICARRAY_H
#define UNTITLED_DYNAMICARRAY_H

//动态增长内存,将存放数据的内存放到堆上
//size记录当前数组中具体的元素个数
//capacity内存空间一共可以存放多少元素

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//定义动态数组
typedef struct DynamicArray{
    int *pArr;//存放数据的地址
    int size;//当前多少个元素
    int capacity;//最大能容纳多少个元素
}Dynamic_Array;//重命名

//对结构体的操作
//初始化 返回结构体,指针指向
Dynamic_Array * InitArray();

//插入
void PushBackArray(Dynamic_Array *arr,int value);//数组 值
//根据位置删除
void RemoveByPosArray(Dynamic_Array *arr,int pos);
//根据值删除
void RemoveByValueArray(Dynamic_Array *arr,int value);
//释放动态数组的内存
void FreeSpaceArray(Dynamic_Array *arr);
//查找
int FindArray(Dynamic_Array *arr,int value);
//打印
void PrintArray(Dynamic_Array *arr);
//清空数组
void ClearArray(Dynamic_Array *arr);
//获得动态数组容量
int CapacityArray(Dynamic_Array *arr);
//获得动态数组当前的元素个数
int SizeArray(Dynamic_Array *arr);
//根据位置获得某个位置元素
int AtArray(Dynamic_Array *arr,int pos);
#endif //UNTITLED_DYNAMICARRAY_H

DynamicArray.cpp


#include "DynamicArray.h"


Dynamic_Array * InitArray(){
    //申请内存
    Dynamic_Array * myArray = (Dynamic_Array*)malloc(sizeof(Dynamic_Array));
    //初始化
    myArray->size=0;
    myArray->capacity=20;
    myArray->pArr = (int*)malloc(sizeof(int)*myArray->capacity);

    return myArray;
}

//插入
void PushBackArray(Dynamic_Array *arr,int value){
    if(arr==NULL){
        return;
    }

    //判断空间是否足够
    if(arr->size==arr->capacity){
        //1申请更大的内存空间 新空间为旧空间的两倍
        int* newSpace =(int*)malloc(sizeof(int)* arr->capacity * 2);
        //2拷贝数据到新空间 注意拷贝的是字节
        memcpy(newSpace,arr->pArr,arr->capacity * sizeof(int));
        //3释放旧空间内存
        free(arr->pArr);

        //更新容量 新的地址
        arr->capacity = arr->capacity *2;
        arr->pArr = newSpace;
    }

    //插入新元素
    arr->pArr[arr->size] = value;
    arr->size++;

}//数组 值
//根据位置删除
void RemoveByPosArray(Dynamic_Array *arr,int pos){
    if(arr==NULL){
        return;
    }

    //判断位置是否有效
    if(pos<0 || pos>=arr->size){
        return;
    }

    //删除元素
    for(int i = pos;i<=arr->size;i++){
        arr->pArr[i]=arr->pArr[i+1];
    }
    arr->size--;

}
//根据值删除value第一次出现的位置
void RemoveByValueArray(Dynamic_Array *arr,int value){
    if(arr==NULL){
        return;
    }

    //找到值的位置
    int pos = FindArray(arr,value);
    //删除
    RemoveByPosArray(arr,pos);
}

//释放动态数组的内存
void FreeSpaceArray(Dynamic_Array *arr){
    if(arr==NULL){
        return;
    }

    if(arr->pArr != NULL){
        free(arr->pArr);
    }
    free(arr);

}
//查找
int FindArray(Dynamic_Array *arr,int value){
    if(arr==NULL){
        return -1;
    }
    //找到值的位置
    int pos = -1;
    for(int i = 0;i<arr->size;i++){
        if(arr->pArr[i]==value){
            pos=i;
            break;
        }
    }
    return pos;
}
//打印
void PrintArray(Dynamic_Array *arr){
    if(arr==NULL){
        return;
    }
    for(int i = 0;i<arr->size;i++){
        printf("%d",arr->pArr[i]);
    }
    printf(" \n ");

}
//清空数组
void ClearArray(Dynamic_Array *arr){
    if(arr==NULL){
        return;
    }

    arr->size=0;

}
//获得动态数组容量
int CapacityArray(Dynamic_Array *arr){
    if(arr==NULL){
        return -1;
    }

    return arr->capacity;
}
//获得动态数组当前的元素个数
int SizeArray(Dynamic_Array *arr){
    if(arr==NULL){
        return -1;
    }

    return arr->size;
}
//根据位置获得某个位置元素
int AtArray(Dynamic_Array *arr,int pos){
    //if(arr==NULL){
    //return -1;
    //}
    //如果值为-1 返回无效
    return arr->pArr[pos];
}

mian.cpp

#include <iostream>
#include "DynamicArray.h"
using namespace std;
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "DynamicArray.h"
int main(){
    //初始化动态数组
    Dynamic_Array *myArray=InitArray();
    //打印容量
    printf("数组容量:%d\n", CapacityArray(myArray));
    printf("数组大小:%d\n", SizeArray(myArray));
    //插入元素
    for(int i = 0;i<30;i++){
        PushBackArray(myArray,i);
    }
    printf("数组容量:%d\n", CapacityArray(myArray));
    printf("数组大小:%d\n", SizeArray(myArray));
    //打印
    PrintArray(myArray);
    //删除
    RemoveByPosArray(myArray,0);
    RemoveByValueArray(myArray,27);
    PrintArray(myArray);
    //查找
    int pos=FindArray(myArray,5);
    printf("位置5查找到:%d %d\n",pos, AtArray(myArray,pos));
    //销毁
    FreeSpaceArray(myArray);
    return 0;
}

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值