C++实现动态数组

偏执的太偏执、 2021-10-19 09:16 446阅读 0赞

DynamicArray.h

  1. #include <stdio.h>
  2. #include <Windows.h>
  3. typedef struct DYNAMICARRAY
  4. {
  5. int* pAddr; // 存放数据的地址
  6. int size; // 当前有多少个元素
  7. int capacity; // 容器当前能容纳多少元素
  8. }Dynamic_Array;
  9. // 动态数组初始化
  10. Dynamic_Array* Init_Array();
  11. // 插入元素
  12. void PushBack_Array(Dynamic_Array* arr, int value);
  13. // 根据位置删除元素
  14. void RemoveByPos_Array(Dynamic_Array* arr, int pos);
  15. // 根据值删除元素
  16. void RemoveByValue_Array(Dynamic_Array* arr, int value);
  17. // 根据值查找某个元素
  18. int Find_Array(Dynamic_Array* arr, int value);
  19. // 根据位置返回某个元素
  20. int At_Array(Dynamic_Array* arr, int pos);
  21. // 打印动态数组
  22. void Print_Array(Dynamic_Array* arr);
  23. // 释放动态数组的内存
  24. void FreeMem_Array(Dynamic_Array* arr);
  25. // 清空数组
  26. void Clear_Array(Dynamic_Array* arr);
  27. // 获得动态数组容量
  28. int GetCapacity_Array(Dynamic_Array* arr);
  29. // 获得动态数组当前元素的个数
  30. int GetSize_Array(Dynamic_Array* arr);

DynamicArray.cpp

  1. #include "DynamicArray.h"
  2. // 动态数组初始化
  3. Dynamic_Array* Init_Array()
  4. {
  5. Dynamic_Array* arr = (Dynamic_Array*)malloc(sizeof(Dynamic_Array));
  6. arr->size = 0;
  7. arr->capacity = 20;
  8. arr->pAddr = (int*)malloc(sizeof(int) * arr->capacity);
  9. return arr;
  10. }
  11. // 插入元素
  12. void PushBack_Array(Dynamic_Array* arr, int value)
  13. {
  14. if (arr == NULL)
  15. {
  16. printf("传入的参数有误!\n");
  17. return;
  18. }
  19. if (arr->size >= arr->capacity)
  20. {
  21. // 1、申请一块更大的内存空间,新空间是旧空间的2倍
  22. int* pAddr2 = (int*)malloc(sizeof(int) * arr->capacity * 2);
  23. memset(pAddr2, 0, sizeof(int) * arr->capacity * 2);
  24. // 2、拷贝数据到新的空间
  25. memcpy(pAddr2, arr->pAddr, arr->capacity * sizeof(int));
  26. // 3、释放旧空间的内存
  27. free(arr->pAddr);
  28. // 4、更新容量
  29. arr->capacity = arr->capacity * 2;
  30. arr->pAddr = pAddr2;
  31. }
  32. // 插入新元素
  33. arr->pAddr[arr->size] = value;
  34. arr->size++;
  35. }
  36. // 根据位置删除元素
  37. void RemoveByPos_Array(Dynamic_Array* arr, int pos)
  38. {
  39. if (arr == NULL)
  40. {
  41. printf("传入的参数有误!\n");
  42. return;
  43. }
  44. if (pos < 0 || pos >= arr->size)
  45. {
  46. printf("要删除的元素的位置有误!\n");
  47. return;
  48. }
  49. for (int i = pos; i < arr->size - 1; i++)
  50. {
  51. arr->pAddr[i] = arr->pAddr[i + 1];
  52. }
  53. arr->size--;
  54. }
  55. // 根据值删除元素
  56. void RemoveByValue_Array(Dynamic_Array* arr, int value)
  57. {
  58. if (arr == NULL)
  59. {
  60. printf("传入的参数有误!\n");
  61. return;
  62. }
  63. int pos = Find_Array(arr, value);
  64. if (pos != -1 && pos != -2)
  65. {
  66. RemoveByPos_Array(arr, pos);
  67. }
  68. }
  69. // 根据值查找某个元素
  70. int Find_Array(Dynamic_Array* arr, int value)
  71. {
  72. if (arr == NULL)
  73. {
  74. printf("传入的参数有误!\n");
  75. return -1;
  76. }
  77. int pos = -1;
  78. for (int i = 0; i < arr->size; i++)
  79. {
  80. if (arr->pAddr[i] == value)
  81. {
  82. pos = i;
  83. }
  84. }
  85. return pos;
  86. }
  87. // 根据位置返回某个元素
  88. int At_Array(Dynamic_Array* arr, int pos)
  89. {
  90. if (arr == NULL)
  91. {
  92. printf("传入的参数有误!\n");
  93. return -1;
  94. }
  95. return arr->pAddr[pos];
  96. }
  97. // 打印动态数组
  98. void Print_Array(Dynamic_Array* arr)
  99. {
  100. if (arr == NULL)
  101. {
  102. printf("传入的参数有误!\n");
  103. return;
  104. }
  105. for (int i = 0; i < arr->size; i++)
  106. {
  107. printf("%d ", arr->pAddr[i]);
  108. }
  109. printf("\n");
  110. }
  111. // 释放动态数组的内存
  112. void FreeMem_Array(Dynamic_Array* arr)
  113. {
  114. if (arr == NULL)
  115. {
  116. printf("传入的参数有误!\n");
  117. return;
  118. }
  119. if (arr->pAddr != NULL)
  120. {
  121. free(arr->pAddr);
  122. }
  123. free(arr);
  124. }
  125. // 清空数组
  126. void Clear_Array(Dynamic_Array* arr)
  127. {
  128. if (arr == NULL)
  129. {
  130. printf("传入的参数有误!\n");
  131. return;
  132. }
  133. arr->size = 0;
  134. }
  135. // 获得动态数组容量
  136. int GetCapacity_Array(Dynamic_Array* arr)
  137. {
  138. if (arr == NULL)
  139. {
  140. printf("传入的参数有误!\n");
  141. return -1;
  142. }
  143. return arr->capacity;
  144. }
  145. // 获得动态数组当前元素的个数
  146. int GetSize_Array(Dynamic_Array* arr)
  147. {
  148. if (arr == NULL)
  149. {
  150. printf("传入的参数有误!\n");
  151. return -1;
  152. }
  153. return arr->size;
  154. }

main.cpp

  1. #include "DynamicArray.h"
  2. void test01(){
  3. //初始化动态数组
  4. Dynamic_Array* myArray = Init_Array();
  5. //打印容量
  6. printf("数组容量:%d\n", GetCapacity_Array(myArray));
  7. printf("数组大小:%d\n", GetSize_Array(myArray));
  8. //插入元素
  9. for (unsigned int i = 0; i < 30; i++){
  10. PushBack_Array(myArray, i);
  11. }
  12. printf("数组容量:%d\n", GetCapacity_Array(myArray));
  13. printf("数组大小:%d\n", GetSize_Array(myArray));
  14. //打印
  15. Print_Array(myArray);
  16. //删除
  17. RemoveByPos_Array(myArray, 0);
  18. RemoveByValue_Array(myArray, 27);
  19. //打印
  20. Print_Array(myArray);
  21. //查找5个位置
  22. int pos = Find_Array(myArray, 5);
  23. printf("5查找到:pos:%d %d\n", pos, At_Array(myArray, pos));
  24. //销毁
  25. FreeMem_Array(myArray);
  26. }
  27. int main()
  28. {
  29. test01();
  30. getchar();
  31. return 0;
  32. }

转载于:https://www.cnblogs.com/duxie/p/11306023.html

发表评论

表情:
评论列表 (有 0 条评论,446人围观)

还没有评论,来说两句吧...

相关阅读

    相关 C#动态数组ArrayLIst

    一 动态数组的定义: 动态数组(ArrayList)代表了可被单独索引的对象的有序集合。它基本上可以替代一个数组。但是,与数组不同的是,您可以使用索引在指定的位置添加和移除

    相关 C++——动态数组

      早就学了动态数组,一直记不住,写出来以便以后用到的时候查阅      在C++中,数组的大小必须是预先定义好的,才能编译通过,但多数情况数组的大小并不能预先知道