1. /*
  2. * DynamicArray.h
  3. *
  4. * Created on: 2019年7月22日
  5. * Author: Jarvis
  6. */
  7. #ifndef SRC_DYNAMICARRAY_H_
  8. #define SRC_DYNAMICARRAY_H_
  9. //动态增长内存 策略 将数据放到堆上
  10. //动态数组 如果5个元素 申请内存 拷贝数据 释放内存
  11. // 容量 capacity 表示我的这块内存空间一共可以存放多少个元素
  12. // size 记录当前数组中具体的元素个数
  13. //定义动态数组的结构体
  14. typedef struct DYNAMICARRAY {
  15. int *pAddr;// 存放数据的地址
  16. int size;//当前有多少个元素
  17. int capacity;//容量, 容器当前能容纳多少个元素
  18. }Dynamic_Array;
  19. //操作函数
  20. //初始化
  21. Dynamic_Array *Init_Array();
  22. //插入
  23. void PushBack_Array(Dynamic_Array *arr, int value);
  24. //根据位置删除
  25. void RemoveByPos_Array(Dynamic_Array *arr, int pos);
  26. //根据值删除
  27. void RemoveByValue_Array(Dynamic_Array *arr, int value);
  28. //查找
  29. int Find_Array(Dynamic_Array *arr, int value);
  30. //打印
  31. void Print_Array(Dynamic_Array *arr);
  32. //释放动态数组的内存
  33. void FreeSpace_Array(Dynamic_Array *arr);
  34. //清空数组
  35. void Clear_Array(Dynamic_Array *arr);
  36. //获得动态数组的容量
  37. int Capacity_Array(Dynamic_Array *arr);
  38. //获得动态数组当前元素的个数
  39. int Size_Array(Dynamic_Array *arr);
  40. //根据位置获得某个位置的元素
  41. int At_Array(Dynamic_Array *arr, int pos);
  42. #endif /* SRC_DYNAMICARRAY_H_ */
  1. /*
  2. * DynamicArray.c
  3. *
  4. * Created on: 2019年7月22日
  5. * Author: Administrator
  6. */
  7. #include <stdlib.h>
  8. #include "DynamicArray.h"
  9. Dynamic_Array *Init_Array() {
  10. Dynamic_Array *myArray = (Dynamic_Array *)malloc(sizeof(Dynamic_Array));
  11. myArray->size = 0;
  12. myArray->capacity = 20;
  13. myArray->pAddr = (int *)malloc(sizeof(int)*myArray->capacity);
  14. return myArray;
  15. }
  16. //插入
  17. void PushBack_Array(Dynamic_Array *arr, int value) {
  18. if(arr == NULL){
  19. return;
  20. }
  21. //判断控件是否足够
  22. if(arr->size == arr->capacity){
  23. //第一步 申请一块更大的内存空间 ,新空间是旧空间的2倍
  24. int *newSpace = malloc(sizeof(int) * arr->capacity*2);
  25. //第二步 拷贝数据到新的空间
  26. memcpy(newSpace, arr->pAddr, arr->capacity * sizeof(int));
  27. //第三步 释放旧空间
  28. free(arr->pAddr);
  29. //更新容量
  30. arr->capacity = arr->capacity * 2;
  31. arr->pAddr = newSpace;
  32. }
  33. //插入新元素
  34. arr->pAddr[arr->size] = value;
  35. arr->size++;
  36. }
  37. //根据位置删除
  38. void RemoveByPos_Array(Dynamic_Array *arr, int pos) {
  39. if(arr == NULL){
  40. return;
  41. }
  42. if(pos < 0 || pos >= arr->size){
  43. return;
  44. }
  45. //删除元素
  46. for(int i = pos; i < arr->size - 1; i++){
  47. arr->pAddr[i] = arr->pAddr[i+1];
  48. }
  49. arr->size--;
  50. }
  51. //根据值删除
  52. void RemoveByValue_Array(Dynamic_Array *arr, int value) {
  53. if(arr == NULL){
  54. return;
  55. }
  56. //找到值的位置
  57. int pos = -1;
  58. for(int i = 0; i< arr->size; i++){
  59. if(arr->pAddr[i] == value){
  60. pos = i;
  61. break;
  62. }
  63. }
  64. //根据位置 删除值
  65. RemoveByPos_Array(arr, pos);
  66. }
  67. //查找
  68. int Find_Array(Dynamic_Array *arr, int value) {
  69. if(arr == NULL){
  70. return -1;
  71. }
  72. //找到值的位置
  73. int pos = -1;
  74. for(int i = 0; i< arr->size; i++){
  75. if(arr->pAddr[i] == value){
  76. pos = i;
  77. break;
  78. }
  79. }
  80. return pos;
  81. }
  82. //打印
  83. void Print_Array(Dynamic_Array *arr) {
  84. for(int i = 0; i < arr->size; i++){
  85. printf("%d ",arr->pAddr[i]);
  86. }
  87. printf("\n");
  88. }
  89. //释放动态数组的内存
  90. void FreeSpace_Array(Dynamic_Array *arr) {
  91. if(arr == NULL){
  92. return;
  93. }
  94. if(arr->pAddr != NULL){
  95. free(arr->pAddr);
  96. }
  97. free(arr);
  98. }
  99. //清空数组
  100. void Clear_Array(Dynamic_Array *arr) {
  101. if(arr == NULL){
  102. return;
  103. }
  104. arr->size = 0;
  105. }
  106. //获得动态数组的容量
  107. int Capacity_Array(Dynamic_Array *arr) {
  108. if(arr == NULL){
  109. return -1;
  110. }
  111. return arr->capacity;
  112. }
  113. //获得动态数组当前元素的个数
  114. int Size_Array(Dynamic_Array *arr) {
  115. if(arr == NULL){
  116. return 0;
  117. }
  118. return arr->size;
  119. }
  120. //根据位置获得某个位置的元素
  121. int At_Array(Dynamic_Array *arr, int pos) {
  122. return arr->pAddr[pos];
  123. }
  1. /*
  2. * mian.c
  3. *
  4. * Created on: 2019年7月22日
  5. * Author: Administrator
  6. */
  7. #include "DynamicArray.h"
  8. #include <stdlib.h>
  9. #include <stdio.h>
  10. #include <string.h>
  11. void test01(){
  12. //初始化动态数组
  13. Dynamic_Array *arr = Init_Array();
  14. //打印 capacity size
  15. printf("after create arr, capacity: %d, size: %d \n",arr->capacity, arr->size);
  16. //插入元素
  17. for(int i = 0; i < 10; i++){
  18. PushBack_Array(arr, i);
  19. }
  20. //打印
  21. printf("插入10个元素后 \n");
  22. Print_Array(arr);
  23. //插入元素
  24. for(int i = 0; i < 30; i++){
  25. PushBack_Array(arr, i);
  26. }
  27. //打印
  28. printf("重新插入30个元素后 \n");
  29. Print_Array(arr);
  30. //删除
  31. RemoveByPos_Array(arr, 0);
  32. RemoveByValue_Array(arr, 5);
  33. //
  34. printf("删除两个元素后 \n");
  35. Print_Array(arr);
  36. //查找
  37. int pos = Find_Array(arr, 30);
  38. printf("位置 5查找到 pos: %d value: %d \n",pos, At_Array(arr, pos));
  39. //销毁
  40. FreeSpace_Array(arr);
  41. }
  42. int main(){
  43. printf("动态数组 \n");
  44. test01();
  45. system("pause");
  46. return 0;
  47. }

动态数组C语言实现的更多相关文章

  1. 可存放任意类型变量的动态数组--C语言实现

    之前在训练营的时候被要求用C语言实现一个可以存放任意类型数据的栈.现在尝试实现一个数组版本. 首先用到的结构体如下(接触了Win32编程所以长得有点像里面的那些类型): typedef struct ...

  2. 【足迹C++primer】40、动态数组

    动态数组 C++语言定义了第二种new表达式语法.能够分配并初始化一个对象数组.标准库中包括 一个名为allocator的类.同意我们将分配和初始化分离. 12.2.1 new和数组 void fun ...

  3. (待续)C#语言中的动态数组(ArrayList)模拟常用页面置换算法(FIFO、LRU、Optimal)

    目录 00 简介 01 算法概述 02 公用方法与变量解释 03 先进先出置换算法(FIFO) 04 最近最久未使用(LRU)算法 05 最佳置换算法(OPT) 00 简介 页面置换算法主要是记录内存 ...

  4. c语言 动态数组

    C语言中,在声明数组时,必须明确告诉编译器数组的大小,之后编译器就会在内存中为该数组开辟固定大小的内存.有些时候,用户并不确定需要多大的内存,使用多大的数组,为了保险起见,有的用户采用定义一个大数组的 ...

  5. 线性表之顺序存储结构(C语言动态数组实现)

    线性表的定义:N个数据元素的有限序列 线性表从存储结构上分为:顺序存储结构(数组)和 链式存储结构(链表) 顺序存储结构:是用一段连续的内存空间存储表中的数据 L=(a1,a2,a3....an) 链 ...

  6. c语言,动态数组

    试着直接malloc一个2*3*4的空间来模拟数组: #include <stdio.h> #include <malloc.h> int main(void) { int** ...

  7. C语言 动态数组实现

    一.概述 C语言是不能直接定义动态数组的,数组必须在初始化时确定长度. 如果要在程序运行时才确定数组的长度,就需要在运行的时候,自己去向系统申请一块内存用动态内存分配实现动态数组. 二.动态内存分配函 ...

  8. C语言基础 - 实现动态数组并增加内存管理

    用C语言实现一个动态数组,并对外暴露出对数组的增.删.改.查函数 (可以存储任意类型的元素并实现内存管理) 这里我的编译器就是xcode 分析: 模拟存放 一个 People类 有2个属性 字符串类型 ...

  9. [C] 在 C 语言编程中实现动态数组对象

    对于习惯使用高级语言编程的人来说,使用 C 语言编程最头痛的问题之一就是在使用数组需要事先确定数组长度. C 语言本身不提供动态数组这种数据结构,本文将演示如何在 C 语言编程中实现一种对象来作为动态 ...

随机推荐

  1. leetcode 1051. Height Checker

    Students are asked to stand in non-decreasing order of heights for an annual photo. Return the minim ...

  2. 两种Tensorflow模型保存的方法

    在Tensorflow中,有两种保存模型的方法:一种是Checkpoint,另一种是Protobuf,也就是PB格式: 一. Checkpoint方法: 1.保存时使用方法: tf.train.Sav ...

  3. poj 1458 Common Subsequence(dp)

    Common Subsequence Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 46630   Accepted: 19 ...

  4. 3.flask核心与源码剖析

    1.session session存储了特定用户会话所需的属性及配置信息,这样,当用户在应用程序的 Web 页之间跳转时,存储在 session 对象中的变量将不会丢失,而是在整个用户会话中一直存在下 ...

  5. concurrent.futures:线程池,让你更加高效、并发的处理任务

    并发任务池 concurrent.futures模块提供了使用工作线程或进程池运行任务的接口. 线程池和进程池的API是一致的,所以应用只需要做最小的修改就可以在线程和进程之间进行切换 这个模块提供了 ...

  6. deep_learning_Function_rnn_cell.BasicLSTMCell

    tf.nn.rnn_cell.BasicLSTMCell(n_hidden, forget_bias=1.0, state_is_tuple=True): n_hidden表示神经元的个数,forge ...

  7. Mandelbrot集合及其渲染

    什么是Mandelbrot集合? Mandelbrot集合是在复数平面上组成分形的点的集合,它正是以数学家Mandelbrot命名. Mandelbrot集合可以用复二次多项式 \[ f_c(z)=z ...

  8. redis3.2 源码安装

    wget http://download.redis.io/releases/redis-3.2.3.tar.gz tar -zxvf redis-.tar.gz cd redis make & ...

  9. Codeforces Round #581 (Div. 2) B. Mislove Has Lost an Array (贪心)

    B. Mislove Has Lost an Array time limit per test1 second memory limit per test256 megabytes inputsta ...

  10. 使用fastjson的parseObject方法将json字符串转换成Map 或者List

    fastjson 转换成map HashMap<String,String> map = JSON.parseObject(jsonStr,new TypeReference<Has ...