• 数据结构 1、基本概念 动态数组实现


    一、大O表示法

    判断一个算法的效率

    难点

    二、线性表

    1.定义

    2.数学定义

    线性表是具有相同类型的n(n>=0)个数据元素的有限序列(a0,a1,a2,...,an),ai是表项,n是表长度

    3.性质

    4.线性表的基本操作

    1.创建线性表

    2.销毁线性表

    3.清空线性表

    4.将元素插入线性表

    5.将元素从线性表中操作

    6.将元素从线性表中删除

    7.获取线性表中某个位置的元素

    8.获取线性表的长度

    4.存储方式

    4.1 顺序存储

    线性表的顺序存储结构,指的是用一段地址连续的存储单元依次存储线性表的数据元素

    动态数组案例

    当插入一个新的元素时,空间不足?

    1.申请一块更大的内存空间

    2.将原空间的数据拷贝到新的空间

    3.释放旧的空间

    4.将元素放入新的空间

    三、动态数组代码实现

    0、定义动态数组的结构体

    1. //定义动态数组的结构体
    2. typedef struct DYNAMICARRY {
    3. int* pAddr;//存放数据的地址
    4. int size;//当前有多少元素
    5. int capacity;//容量,容器当前最大容纳元素
    6. }Dynamic_Array;

    1、动态数组的初始化

    1. //动态数组的初始化
    2. Dynamic_Array* Init_Array() {
    3. //申请内存
    4. Dynamic_Array* myArray = (Dynamic_Array*)malloc(sizeof(Dynamic_Array));
    5. //初始化
    6. myArray->size = 0;
    7. myArray->capacity = 20;
    8. //动态分配内存
    9. myArray->pAddr = (int*)malloc(sizeof(int) * myArray->capacity);
    10. return myArray;
    11. }

    2、插入新数据

    1. //插入 value 插入的值
    2. void PushBack_Array(Dynamic_Array* arr, int value) {
    3. //判断数组长度是否为0
    4. if (arr == NULL) {
    5. return;
    6. }
    7. //判断空间是否足够 capacity记录当前数组空间长度 size==capacity数组已满
    8. if (arr->size == arr->capacity) {
    9. //第一步 申请一块更大的内存空间 默认新空间是旧空间的两倍
    10. int* newSpace = (int*)malloc(sizeof(int) * arr->capacity * 2);
    11. //第二步 拷贝数据到新的空间 newSpace新空间 arr->pAddr旧空间
    12. memcpy(newSpace, arr->pAddr, arr->capacity * sizeof(int));
    13. //第三步 释放旧的内存
    14. free(arr->pAddr);
    15. //经过上述步骤 释放完毕
    16. //更新容量 旧空间到新空间
    17. arr->capacity = arr->capacity * 2;
    18. arr->pAddr = newSpace;
    19. }
    20. //插入元素 size记录当前数组中具体的元素个数
    21. arr->pAddr[arr->size] = value;
    22. arr->size++;
    23. }

    3、根据元素位置删除

    1. //根据位置删除
    2. void RemoveByPos_Array(Dynamic_Array* arr, int pos) {
    3. if (arr == NULL) {
    4. printf("数组为空\n");
    5. return;
    6. }
    7. //判断位置是否有效
    8. if (pos < 0||pos>=arr->size) {
    9. printf("数组位置无效\n");
    10. return;
    11. }
    12. else {
    13. //删除元素 pos是被删除位置 从被删除位置向后遍历 将元素往后更新
    14. for (int i = pos; i < arr->size-1; i++) {
    15. arr->pAddr[i] = arr->pAddr[i + 1];
    16. }
    17. //当前数组存储元素数减一
    18. arr->size--;
    19. }
    20. }

    4、根据元素值删除第一次该值出现的位置

    1. //根据值删除value第一次出现的位置
    2. void RemoveByValue_Array(Dynamic_Array* arr, int value) {
    3. //判空操作
    4. if (arr == NULL) {
    5. return;
    6. }
    7. //找到值的位置 找到value值在数组arr中第一次出现的位置
    8. int pos = -1;
    9. for (int i = 0; i < arr->size; i++)
    10. {
    11. if (arr->pAddr[i] == value) {
    12. pos = i;
    13. break;
    14. }
    15. }
    16. // 根据value值出现的位置删除位置删除
    17. RemoveByPos_Array(arr, pos);
    18. }

    5、查找

    1. //查找
    2. int Find_Array(Dynamic_Array* arr, int value) {
    3. //对数组进行判空
    4. if (arr == NULL) {
    5. return -1;
    6. }
    7. //查找
    8. //找到值的位置
    9. int pos = -1;
    10. for (int i = 0; i < arr->size; i++)
    11. {
    12. if (arr->pAddr[i] == value) {
    13. pos = i;
    14. break;
    15. }
    16. }
    17. for (int i = 0; i < arr->size; i++)
    18. {
    19. if (arr->pAddr[i] == value) {
    20. pos = i;
    21. break;
    22. }
    23. }
    24. return pos;
    25. }

    6、打印

    1. //打印
    2. void Print_Array(Dynamic_Array* arr) {
    3. if (arr == NULL) {
    4. return;
    5. }
    6. for (int i = 0; i < arr->size; i++)
    7. {
    8. printf("%d ", arr->pAddr[i]);
    9. }
    10. printf("\n");
    11. }

    7、释放动态数组的内存

    1. //释放动态数组的内存
    2. void FreeSpace_Array(Dynamic_Array* arr) {
    3. if (arr == NULL) {
    4. return;
    5. }
    6. if (arr->pAddr != NULL) {
    7. free(arr->pAddr);
    8. }
    9. free(arr);
    10. }

    8、清空数组

    1. //清空数组
    2. void Clear_Array(Dynamic_Array* arr) {
    3. if (arr == NULL) {
    4. return;
    5. }
    6. //pAddr指向的空间直接为0
    7. arr->size = 0;
    8. }

    9、获得动态数组的容量capacity

    1. //获得动态数组容量
    2. int Capacity_Array(Dynamic_Array* arr) {
    3. if (arr == NULL) {
    4. return -1;
    5. }
    6. return arr->capacity;
    7. }

    10、获得动态数组当前元素个数

    1. //获得动态数组当前元素个数
    2. int Size_Array(Dynamic_Array* arr) {
    3. if (arr == NULL) {
    4. return -1;
    5. }
    6. return arr->size;
    7. }

    11、根据位置,获得数组中某个位置的元素

    1. //根据位置 获得某个位置的元素
    2. int At_Array(Dynamic_Array* arr, int pos) {
    3. return arr->pAddr[pos];
    4. }

    四、函数测试

    1. #define _CRT_SECURE_NO_WARNINGS 1
    2. #include
    3. #include
    4. #include
    5. #include
    6. #include
    7. #include
    8. #include
    9. #include "动态数组.h"//方法定义在源文件动态数组.c中
    10. //11.12 动态数组
    11. //动态增长内存,将存放的数据放在堆上
    12. //动态数组 申请内存 拷贝数据 释放内存 插入多一个元素
    13. //容量capacity 表示我的这块内存空间一共可以存放多少元素
    14. //size概念 记录当前数组中具体的元素个数
    15. void test01() {
    16. //初始化一个动态数组
    17. Dynamic_Array* myArray = Init_Array();
    18. //打印数组容量
    19. printf("数组容量:%d\n", Capacity_Array(myArray));
    20. printf("数组大小:%d\n", Size_Array(myArray));
    21. //插入元素
    22. for (int i = 0; i < 30; i++) {
    23. PushBack_Array(myArray , i);
    24. }
    25. printf("数组容量:%d\n", Capacity_Array(myArray));
    26. printf("数组大小:%d\n", Size_Array(myArray));
    27. //打印
    28. Print_Array(myArray);
    29. //根据位置删除value第一次出现的位置
    30. RemoveByPos_Array(myArray, 0);
    31. Print_Array(myArray);
    32. //根据值删除元素
    33. RemoveByValue_Array(myArray, 28);
    34. Print_Array(myArray);
    35. //打印
    36. //查找第五个位置的元素
    37. int pos=Find_Array(myArray,5);
    38. printf("5查找到:pos:%d %d\n", pos, At_Array(myArray, pos));
    39. //销毁
    40. FreeSpace_Array(myArray);
    41. }
    42. int main()
    43. {
    44. test01();
    45. system("pause");
    46. return 0;
    47. }

    测试结果

  • 相关阅读:
    springboot中注解介绍
    个人作品录
    【全志T113-S3_100ask】15-1 内核5.4驱动spi屏幕——ILI9341
    微信公众号之获取ticket
    Qt状态机框架
    ElasticSearch进阶:一文全览各种ES查询在Java中的实现
    2024年软件测试面试题大全【答案+文档】
    使用 excel 快速拼接省市区镇街村居五级区划完整名称
    HarmonyOS应用开发学习历程(1)初识DevEco Studio
    列主高斯消元法
  • 原文地址:https://blog.csdn.net/m0_73983707/article/details/134172176