C语言-动态数组

 1 #include <stdio.h>
 2 #include "Dynamic_array.h"
 3 void test01(void)
 4 {
 5     Dynamic_Array* myArray = Init_Array();
 6     printf("数组容量:%d\t大小:%d\n", Capacity_Array(myArray), Size_Array(myArray));
 7     for (int i = 0; i < 30; i++)
 8     {
 9         PushBack_Array(myArray,i);
10     }
11     printf("数组容量:%d\t大小:%d\n", Capacity_Array(myArray), Size_Array(myArray));//增长策略为原数组的二倍
12     //打印
13     Print_Array(myArray);
14     //删除
15     RemoveByValue_Array(myArray, 15);
16     RemoveByPos_Array(myArray, 2);
17     printf("数组容量:%d\t大小:%d\n", Capacity_Array(myArray), Size_Array(myArray));//增长策略为原数组的二倍
18     Print_Array(myArray);
19     //查找
20     printf("6元素的位置为:%d\t5位置的元素为:%d\n", Find_Array(myArray, 6), At_Array(myArray, 5));
21     //销毁
22     FreeSpace_Array(myArray);
23 }
24 int main(void)
25 {
26     test01();
27     system("pause");
28 }
mian.c
  1 #include "Dynamic_array.h"
  2 //动态数组的初始化
  3 Dynamic_Array* Init_Array() {
  4     Dynamic_Array* myArray = (Dynamic_Array*)malloc(sizeof(Dynamic_Array));
  5     myArray->size=0;
  6     myArray->capacity = 20;
  7     myArray->pAddr = (int*)malloc((myArray->capacity)*sizeof(int));
  8     return myArray;
  9 }
 10 //插入
 11 void PushBack_Array(Dynamic_Array* arr, int value) {
 12     if (arr == NULL)
 13     {
 14         return;
 15     }
 16     if (arr->size == arr->capacity)
 17     {
 18         int* newSpace = (int*)malloc(arr->capacity * sizeof(int) * 2);
 19         memcpy(newSpace, arr->pAddr, arr->capacity * sizeof(int));
 20         free(arr->pAddr);
 21         arr->capacity = 2 * arr->capacity;
 22         arr->pAddr = newSpace;
 23     }
 24     arr->pAddr[arr->size] = value;
 25     arr->size++;
 26 }
 27 //根据位置删除
 28 void RemoveByPos_Array(Dynamic_Array* arr, int pos) {
 29     if (arr == NULL)
 30     {
 31         return;
 32     }
 33     if (pos >= arr->size  ||  pos<0)
 34     {
 35         return;
 36     }
 37     //删除元素
 38     for (int i = pos; i < arr->size -1; i++)
 39     {
 40         arr->pAddr[i] = arr->pAddr[i + 1];
 41     }
 42     arr->size--;
 43 }
 44 //获取某个数据的位置
 45 int Find_Array(Dynamic_Array* arr, int value) {
 46     if (arr == NULL)
 47     {
 48         return -1;
 49     }
 50     int pos = -1;
 51     for (int i = 0; i < arr->size; i++)
 52     {
 53         //查找值的位置
 54         if (arr->pAddr[i] == value)
 55         {
 56             pos = i;
 57             break;
 58         }
 59     }
 60     return pos;
 61 }
 62 //根据值删除
 63 void RemoveByValue_Array(Dynamic_Array* arr, int value) {
 64     if (arr == NULL)
 65     {
 66         return;
 67     }
 68     int pos = Find_Array(arr, value);
 69     RemoveByPos_Array(arr, pos);
 70 }
 71 //打印
 72 void Print_Array(Dynamic_Array* arr) {
 73     if (arr==NULL)
 74     {
 75         return ;
 76     }
 77     for (int i = 0; i < arr->size; i++)
 78     {
 79         printf("%d ", arr->pAddr[i]);
 80     }
 81     printf("\n");
 82 }
 83 //释放动态数组的内存
 84 void FreeSpace_Array(Dynamic_Array* arr) {
 85     if (arr==NULL)
 86     {
 87         return;
 88     }
 89     if (arr->pAddr != NULL)
 90     {
 91         free(arr->pAddr);
 92     }
 93     free(arr);
 94 }
 95 //清空数组
 96 void Clear_Array(Dynamic_Array* arr) {
 97     if (arr == NULL)
 98     {
 99         return;
100     }
101     arr->size = 0;
102 }
103 //获取容量
104 int Capacity_Array(Dynamic_Array* arr) {
105     if (arr == NULL)
106     {
107         return -1;
108     }
109     return arr->capacity; 
110 }
111 //获取元素个数
112 int Size_Array(Dynamic_Array* arr) {
113     if (arr == NULL)
114     {
115         return -1;
116     }
117     return arr->size;
118 }
119 //获取某个位置的数据
120 int At_Array(Dynamic_Array* arr, int pos) {
121     return arr->pAddr[pos];
122 }
Dynamic_array.c
 1 #ifndef _DYNAMIC_ARRAY_H_
 2 #define _DYNAMIC_ARRAY_H_
 3 
 4 #include <stdio.h>
 5 #include <string.h>
 6 #include <stdlib.h>
 7 
 8 //动态数组结构体
 9 typedef struct Dynamicarray {
10     int* pAddr;        //数组头指针
11     int size;        //当前数组元素个数
12     int capacity;    //当前动态数组最大容量
13 }Dynamic_Array;
14 //动态数组操作函数  增、删、改、查、打印
15 //初始化
16 Dynamic_Array* Init_Array(); //函数声明
17 //插入
18 void PushBack_Array(Dynamic_Array* arr, int value);
19 //根据位置删除
20 void RemoveByPos_Array(Dynamic_Array* arr, int pos);
21 //根据值删除
22 void RemoveByValue_Array(Dynamic_Array* arr, int value);
23 //打印
24 void Print_Array(Dynamic_Array* arr);
25 //释放动态数组的内存
26 void FreeSpace_Array(Dynamic_Array* arr);
27 //清空数组
28 void Clear_Array(Dynamic_Array* arr);
29 //获取容量
30 int Capacity_Array(Dynamic_Array* arr);
31 //获取元素个数
32 int Size_Array(Dynamic_Array* arr);
33 //获取某个位置的数据
34 int At_Array(Dynamic_Array* arr, int pos);
35 //获取某个数据的位置
36 int Find_Array(Dynamic_Array* arr, int value);
37 #endif
Dynamic_array.h

程序的时候经常要定义这样一个数组,要前面程序运行后才能知道数组的大小,然而C语言不支持直接定义不定长数组的定义,但是我们可以通过动态数组实现一个不定长度的数组。其核心思想就是malloc一块内存,转换成期望的指针类型,那么就可以该指针通过动态往这个内存中存数据。

动态数组并不是真正意义上的动态的内存,而是一块连续的内存,当添加新的元素时,容量已经等于当前的大小的时候(存不下了),执行下面3步(详见代码)

  1. 重新开辟一块大小为当前容量两倍的数组
  2. 把原数据拷贝过去
  3. 释放掉旧的数组
  4. 完事后再把这个元素加在后面。
posted @ 2020-08-20 12:33  起的比鸡还早  阅读(458)  评论(0)    收藏  举报