线性表的顺序存储:用一块连续的内存空间
插入新元素,空间不足
申请更大的内存空间,
旧的空间数据拷贝到新空间
释放旧空间的内存
新元素插入到新空间
构成元素:
容量,元素个数,int指针
1 2 3 4 5
| typedef struct DYNAMICARRAY { int * pAddr; int size; int capacity; }Dynamic_Array;
|
数组行为:
初始化,插入,根据位置删除,根据值删除,查找,打印元素,释放动态数组的内存
清空数组,获得动态数组容量,获得动态数据当前元素个数,根据位置获得某个位置元素
1.初始化
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| Dynamic_Array * Init_Array() { Dynamic_Array * myArray = (Dynamic_Array *)malloc(sizeof(Dynamic_Array));
if (myArray == NULL) { return NULL;
} myArray->size = 0; myArray->capacity = 20; myArray->pAddr = (int *)malloc(myArray->capacity * sizeof(int)); if (myArray->pAddr == NULL) { return NULL; } return myArray; }
|
2.插入
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| void Push_Back_Array(Dynamic_Array* arr, int value) { if (arr == NULL) { return; }
if (arr->size == arr->capacity) { int* newSpace = (int *)malloc(arr->capacity * sizeof(int) * 2);
memcpy(newSpace, arr->pAddr, arr->capacity * sizeof(int)); free(arr->pAddr); arr->capacity = arr->capacity * 2; arr->pAddr = newSpace;
} arr->pAddr[arr->size] = value; arr->size++;
}
|
3.根据位置删除
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| void Remove_Array(Dynamic_Array * arr, int pos) { if (arr == NULL) { return; }
if (pos < 0 || pos >= arr->size) { return; } for (int i = pos; i < arr->size - 1; i++) { arr->pAddr[i] = arr->pAddr[i + 1];
} arr->size--;
}
|
4.根据值删除
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| void RemoveByValue(Dynamic_Array * arr, int value) { if (arr == NULL) { return; } int pos = Find_Array(arr,value); if (pos < 0 || pos >= arr->size) { return; } Remove_Array(arr, pos); }
|
5.查找
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| int Find_Array(Dynamic_Array * arr, int value) {
if (arr == NULL) { return -1; } int pos = -1; for (int i = 0; i < arr->size; i++) { if (arr->pAddr[i] == value) { pos = i;
break; } } return pos;
}
|
6.打印元素
1 2 3 4 5 6 7 8 9 10
| void Print_Array(Dynamic_Array * arr) {
if (arr == NULL) { return; } for (int i = 0; i < arr->size; i++) { printf("%d ", arr->pAddr[i]); } printf("\n"); }
|
7.释放动态数组的内存
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| void FreeSpace_Array(Dynamic_Array * arr) {
if (arr != NULL) { if (arr->pAddr != NULL) { free(arr->pAddr); }
free(arr); } arr = NULL; }
|
8.清空数组
1 2 3 4 5 6 7 8
| void Clear_Array(Dynamic_Array * arr) { if (arr == NULL) { return; }
arr->size = 0; }
|
9.获得动态数组容量
1 2 3 4 5 6 7 8
| int Capacity_Array(Dynamic_Array * arr) { if (arr == NULL) { return -1; }
return arr->capacity; }
|
10.获得动态数据当前元素个数
1 2 3 4 5 6 7
| int Size_Array(Dynamic_Array * arr) { if (arr == NULL) { return -1; } return arr->size; }
|
11.根据位置获得某个位置元素
1 2 3 4 5 6 7
| int At_Array(Dynamic_Array * arr, int pos) { if (arr == NULL) { return -1; } return arr->pAddr[pos]; }
|
DynamicArray.h
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
| #ifndef DYNAMIC_ARRAY_H #define DYNAMIC_ARRAY_H #include<stdio.h> #include<string.h> #include<stdlib.h>
typedef struct DYNAMICARRAY { int * pAddr; int size; int capacity; }Dynamic_Array;
Dynamic_Array * Init_Array();
void Push_Back_Array(Dynamic_Array* arr,int value);
void Remove_Array(Dynamic_Array * arr,int pos);
void RemoveByValue(Dynamic_Array * arr,int value);
int Find_Array(Dynamic_Array * arr,int value);
void Print_Array(Dynamic_Array * arr);
void FreeSpace_Array(Dynamic_Array * arr);
void Clear_Array(Dynamic_Array * arr);
int Capacity_Array(Dynamic_Array * arr);
int Size_Array(Dynamic_Array * arr);
int At_Array(Dynamic_Array * arr, int pos);
#endif
|
DynamicArray.c
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161
| #include"DynamicArray.h"
Dynamic_Array * Init_Array() {
Dynamic_Array * myArray = (Dynamic_Array *)malloc(sizeof(Dynamic_Array));
if (myArray == NULL) { return NULL;
} myArray->size = 0; myArray->capacity = 20; myArray->pAddr = (int *)malloc(myArray->capacity * sizeof(int)); if (myArray->pAddr == NULL) { return NULL; } return myArray; }
void Push_Back_Array(Dynamic_Array* arr, int value) { if (arr == NULL) { return; }
if (arr->size == arr->capacity) { int* newSpace = (int *)malloc(arr->capacity * sizeof(int) * 2);
memcpy(newSpace, arr->pAddr, arr->capacity * sizeof(int)); free(arr->pAddr); arr->capacity = arr->capacity * 2; arr->pAddr = newSpace;
} arr->pAddr[arr->size] = value; arr->size++;
}
void Remove_Array(Dynamic_Array * arr, int pos) { if (arr == NULL) { return; }
if (pos < 0 || pos >= arr->size) { return; } for (int i = pos; i < arr->size - 1; i++) { arr->pAddr[i] = arr->pAddr[i + 1];
} arr->size--;
}
void RemoveByValue(Dynamic_Array * arr, int value) { if (arr == NULL) { return; } int pos = Find_Array(arr,value); if (pos < 0 || pos >= arr->size) { return; } Remove_Array(arr, pos); }
int Find_Array(Dynamic_Array * arr, int value) {
if (arr == NULL) { return -1; } int pos = -1; for (int i = 0; i < arr->size; i++) { if (arr->pAddr[i] == value) { pos = i;
break; } } return pos;
}
void Print_Array(Dynamic_Array * arr) {
if (arr == NULL) { return; } for (int i = 0; i < arr->size; i++) { printf("%d ", arr->pAddr[i]); } printf("\n"); }
void FreeSpace_Array(Dynamic_Array * arr) {
if (arr != NULL) { if (arr->pAddr != NULL) { free(arr->pAddr); }
free(arr); } arr = NULL; }
void Clear_Array(Dynamic_Array * arr) { if (arr == NULL) { return; }
arr->size = 0; }
int Capacity_Array(Dynamic_Array * arr) { if (arr == NULL) { return -1; }
return arr->capacity; }
int Size_Array(Dynamic_Array * arr) { if (arr == NULL) { return -1; } return arr->size; }
int At_Array(Dynamic_Array * arr, int pos) { if (arr == NULL) { return -1; } return arr->pAddr[pos]; }
|
main.c
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
|
#include<stdio.h> #include"DynamicArray.h"
void test() {
Dynamic_Array *myArr = Init_Array();
if (myArr == NULL) { return; }
printf("数组容量:%d\n", Capacity_Array(myArr)); printf("数组元素长度:%d\n", Size_Array(myArr));
for (int i = 0; i < 30; i++) { Push_Back_Array(myArr, i); } Print_Array(myArr);
printf("数组容量:%d\n", Capacity_Array(myArr)); printf("数组元素长度:%d\n", Size_Array(myArr)); int pos = Find_Array(myArr, 20); printf("查找20的元素:pos=%d value=%d\n", pos, myArr->pAddr[pos]); printf("元素:%d\n", At_Array(myArr,pos));
Remove_Array(myArr, pos); Print_Array(myArr);
RemoveByValue(myArr, 23); Print_Array(myArr);
Clear_Array(myArr); printf("数组容量:%d\n", Capacity_Array(myArr)); printf("数组元素长度:%d\n", Size_Array(myArr)); FreeSpace_Array(myArr); }
int main() { test(); return 0; }
|