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 }
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 }
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
写程序的时候经常要定义这样一个数组,要前面程序运行后才能知道数组的大小,然而C语言不支持直接定义不定长数组的定义,但是我们可以通过动态数组实现一个不定长度的数组。其核心思想就是malloc一块内存,转换成期望的指针类型,那么就可以该指针通过动态往这个内存中存数据。
动态数组并不是真正意义上的动态的内存,而是一块连续的内存,当添加新的元素时,容量已经等于当前的大小的时候(存不下了),执行下面3步(详见代码)
- 重新开辟一块大小为当前容量两倍的数组
- 把原数据拷贝过去
- 释放掉旧的数组
- 完事后再把这个元素加在后面。

浙公网安备 33010602011771号