数据结构【动态数组】

打印 上一主题 下一主题

主题 931|帖子 931|积分 2793

数据结构【动态数组】

在堆中申请数组空间,扩容时realloc,注意不可增删改的情况并处理即可。
以下代码不一定完全正确。
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. /**
  4. * 声明动态数组,并提供相关的函数操作
  5. */
  6. // 动态数组结构体
  7. typedef struct Array
  8. {
  9.     // 动态数组
  10.     int *elementData;
  11.     // 容量
  12.     size_t capacity;
  13.     // 长度
  14.     size_t size;
  15. } DynamicArray;
  16. // 初始化动态数组
  17. void initDynamicArray(DynamicArray *array, size_t initialCapacity);
  18. // 释放动态数组内存
  19. void destroyDynamicArray(DynamicArray *array);
  20. // 调整动态数组内存大小
  21. void resizeDynamicArray(DynamicArray *array, size_t newCapacity);
  22. // 获取动态数组长度(元素个数)
  23. size_t getLength(const DynamicArray *array);
  24. // 在指定位置插入新元素
  25. void insertAt(DynamicArray *array, size_t index, int element);
  26. // 在末尾插入新元素
  27. void insertEnd(DynamicArray *array, int element);
  28. // 删除指定位置的元素并返回被删除的元素
  29. int deleteAt(DynamicArray *array, size_t index);
  30. // 删除末尾的元素并返回被删除的元素
  31. int deleteEnd(DynamicArray *array);
  32. // 遍历所有的元素
  33. void print(DynamicArray *array);
  34. /**
  35. * 主函数
  36. */
  37. int main(int argc, char const *argv[])
  38. {
  39.     DynamicArray array;
  40.     initDynamicArray(&array, 2);
  41.     insertAt(&array, 0, 10);
  42.     insertAt(&array, 0, 20);
  43.     insertAt(&array, 0, 20);
  44.     print(&array);
  45.     getchar();
  46.     return 0;
  47. }
  48. // 初始化动态数组
  49. void initDynamicArray(DynamicArray *array, size_t initialCapacity){
  50.     // 分配空间
  51.     if (initialCapacity > 0) {
  52.         array->elementData = (int *) malloc(initialCapacity * (sizeof(int)));
  53.     } else if (initialCapacity == 0) {
  54.         array->elementData = NULL;
  55.     } else {
  56.         printf("您输入的长度不合法。");
  57.         return;
  58.     }
  59.     // 初始化capacity
  60.     array->capacity = initialCapacity;
  61.     // todo 初始化size
  62.     array->size = 0;
  63. }
  64. // 释放动态数组内存
  65. void destroyDynamicArray(DynamicArray *array){
  66.     free(array->elementData);
  67. }
  68. // 扩容
  69. void resizeDynamicArray(DynamicArray *array, size_t newCapacity){
  70.     printf("1.5倍扩容启动\n");
  71.     array->elementData = realloc(array->elementData, newCapacity*sizeof(int));
  72.     array->capacity += array->capacity>>1;
  73. }
  74. // 获取动态数组长度(元素个数)
  75. size_t getLength(const DynamicArray *array){
  76.     return array->size;
  77. }
  78. // 在指定位置插入新元素
  79. void insertAt(DynamicArray *array, size_t index, int element){
  80.     // index 不符合规则的情况
  81.     if(index < 0 || index > array->size){
  82.         printf("无效的位置输入\n");
  83.         return;
  84.     }
  85.     (array->size == array->capacity) ? resizeDynamicArray(array, array->capacity += array->capacity>>1) : 0;
  86.     //
  87.     for(int i = array->size; i>index; i--){
  88.         array->elementData[i] = array->elementData[i-1];
  89.     }
  90.     array->elementData[index] = element;
  91.     array->size++;
  92. }
  93. // 在末尾插入新元素
  94. void insertEnd(DynamicArray *array, int element){
  95.     insertAt(array, array->size, element);
  96. }
  97. // 删除指定位置的元素并返回被删除的元素
  98. int deleteAt(DynamicArray *array, size_t index){
  99.     if(index < 0 || index >= array->size){
  100.         printf("无效的元素删除\n");
  101.         return -1;
  102.     }
  103.     int temp = array->elementData[index];
  104.     for(int i = index+1; i<array->size; i++){
  105.         array->elementData[i-1] = array->elementData[i];
  106.     }
  107.     array->size--;
  108.     return temp;
  109. }
  110. // 删除末尾的元素并返回被删除的元素
  111. int deleteEnd(DynamicArray *array){
  112.     return deleteAt(array, array->size-1);
  113. }
  114. // 遍历所有的元素
  115. void print(DynamicArray *array){
  116.     for(int i = 0; i<array->size; i++){
  117.         printf("%d\n", array->elementData[i]);
  118.     }
  119.     printf("\n");
  120. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

卖不甜枣

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表