• C++实现动态数组


    DynamicArray.h

    #include <stdio.h>
    #include <Windows.h>
    
    typedef struct DYNAMICARRAY
    {
        int* pAddr; // 存放数据的地址
        int size; // 当前有多少个元素
        int capacity;  // 容器当前能容纳多少元素
    }Dynamic_Array;
    
    // 动态数组初始化
    Dynamic_Array* Init_Array();
    
    // 插入元素
    void PushBack_Array(Dynamic_Array* arr, int value);
    
    // 根据位置删除元素
    void RemoveByPos_Array(Dynamic_Array* arr, int pos);
    
    // 根据值删除元素
    void RemoveByValue_Array(Dynamic_Array* arr, int value);
    
    // 根据值查找某个元素
    int Find_Array(Dynamic_Array* arr, int value);
    
    // 根据位置返回某个元素
    int At_Array(Dynamic_Array* arr, int pos);
    
    // 打印动态数组
    void Print_Array(Dynamic_Array* arr);
    
    // 释放动态数组的内存
    void FreeMem_Array(Dynamic_Array* arr);
    
    // 清空数组
    void Clear_Array(Dynamic_Array* arr);
    
    // 获得动态数组容量
    int GetCapacity_Array(Dynamic_Array* arr);
    
    // 获得动态数组当前元素的个数
    int GetSize_Array(Dynamic_Array* arr);

    DynamicArray.cpp

    #include "DynamicArray.h"
    
    // 动态数组初始化
    Dynamic_Array* Init_Array()
    {
        Dynamic_Array* arr = (Dynamic_Array*)malloc(sizeof(Dynamic_Array));
        arr->size = 0;
        arr->capacity = 20;
        arr->pAddr = (int*)malloc(sizeof(int) * arr->capacity);
        return arr;
    }
    
    // 插入元素
    void PushBack_Array(Dynamic_Array* arr, int value)
    {
        if (arr == NULL)
        {
            printf("传入的参数有误!
    ");
            return;
        }
        if (arr->size >= arr->capacity)
        {
            // 1、申请一块更大的内存空间,新空间是旧空间的2倍
            int* pAddr2 = (int*)malloc(sizeof(int) * arr->capacity * 2);
            memset(pAddr2, 0, sizeof(int) * arr->capacity * 2);
            // 2、拷贝数据到新的空间
            memcpy(pAddr2, arr->pAddr, arr->capacity * sizeof(int));
            // 3、释放旧空间的内存
            free(arr->pAddr);
            // 4、更新容量
            arr->capacity = arr->capacity * 2;
            arr->pAddr = pAddr2;
        }
        // 插入新元素
        arr->pAddr[arr->size] = value;
        arr->size++;
    }
    
    // 根据位置删除元素
    void RemoveByPos_Array(Dynamic_Array* arr, int pos)
    {
        if (arr == NULL)
        {
            printf("传入的参数有误!
    ");
            return;
        }
        if (pos < 0 || pos >= arr->size)
        {
            printf("要删除的元素的位置有误!
    ");
            return;
        }
        for (int i = pos; i < arr->size - 1; i++)
        {
            arr->pAddr[i] = arr->pAddr[i + 1];
        }
        arr->size--;
    }
    
    // 根据值删除元素
    void RemoveByValue_Array(Dynamic_Array* arr, int value)
    {
        if (arr == NULL)
        {
            printf("传入的参数有误!
    ");
            return;
        }
        int pos = Find_Array(arr, value);
        if (pos != -1 && pos != -2)
        {
            RemoveByPos_Array(arr, pos);
        }
    }
    
    // 根据值查找某个元素
    int Find_Array(Dynamic_Array* arr, int value)
    {
        if (arr == NULL)
        {
            printf("传入的参数有误!
    ");
            return -1;
        }
        int pos = -1;
        for (int i = 0; i < arr->size; i++)
        {
            if (arr->pAddr[i] == value)
            {
                pos = i;
            }
        }
        return pos;
    }
    
    // 根据位置返回某个元素
    int At_Array(Dynamic_Array* arr, int pos)
    {
        if (arr == NULL)
        {
            printf("传入的参数有误!
    ");
            return -1;
        }
        return arr->pAddr[pos];
    }
    
    // 打印动态数组
    void Print_Array(Dynamic_Array* arr)
    {
        if (arr == NULL)
        {
            printf("传入的参数有误!
    ");
            return;
        }
        for (int i = 0; i < arr->size; i++)
        {
            printf("%d ", arr->pAddr[i]);
        }
        printf("
    ");
    }
    
    // 释放动态数组的内存
    void FreeMem_Array(Dynamic_Array* arr)
    {
        if (arr == NULL)
        {
            printf("传入的参数有误!
    ");
            return;
        }
        if (arr->pAddr != NULL)
        {
            free(arr->pAddr);
        }
        free(arr);
    }
    
    // 清空数组
    void Clear_Array(Dynamic_Array* arr)
    {
        if (arr == NULL)
        {
            printf("传入的参数有误!
    ");
            return;
        }
        arr->size = 0;
    }
    
    // 获得动态数组容量
    int GetCapacity_Array(Dynamic_Array* arr)
    {
        if (arr == NULL)
        {
            printf("传入的参数有误!
    ");
            return -1;
        }
        return arr->capacity;
    }
    
    // 获得动态数组当前元素的个数
    int GetSize_Array(Dynamic_Array* arr)
    {
        if (arr == NULL)
        {
            printf("传入的参数有误!
    ");
            return -1;
        }
        return arr->size;
    }

    main.cpp

    #include "DynamicArray.h"
    
    void test01(){
    
        //初始化动态数组
        Dynamic_Array* myArray = Init_Array();
        //打印容量
        printf("数组容量:%d
    ", GetCapacity_Array(myArray));
        printf("数组大小:%d
    ", GetSize_Array(myArray));
        //插入元素
        for (unsigned int i = 0; i < 30; i++){
            PushBack_Array(myArray, i);
        }
        printf("数组容量:%d
    ", GetCapacity_Array(myArray));
        printf("数组大小:%d
    ", GetSize_Array(myArray));
        //打印
        Print_Array(myArray);
    
        //删除
        RemoveByPos_Array(myArray, 0);
        RemoveByValue_Array(myArray, 27);
        //打印
        Print_Array(myArray);
    
        //查找5个位置
        int pos = Find_Array(myArray, 5);
        printf("5查找到:pos:%d %d
    ", pos, At_Array(myArray, pos));
    
        //销毁
        FreeMem_Array(myArray);
    }
    
    int main()
    {
        test01();
        getchar();
        return 0;
    }
  • 相关阅读:
    Soldier and Number Game素数筛
    HDU1501Zipper字符串的dfs
    HDU1285 确定比赛名次 拓扑排序模板题
    HDU1595 find the longest of the shortest dijkstra+记录路径
    HDU1556 Color the ball 前缀和/线段树/树状数组
    Function Run Fun递归+细节处理
    数学公式
    日常 java+雅思+训练题1
    HDU1423Greatest Common Increasing Subsequence
    HDU1595find the longest of the shortestdijkstra+记录路径
  • 原文地址:https://www.cnblogs.com/duxie/p/11306023.html
Copyright © 2020-2023  润新知