12、順序表的順序存儲結構
阿新 • • 發佈:2018-04-24
end truct 有效 系列 ngs ray city back AI
動態數組實現
動態數組頭文件:DynamicArray.h
1 #ifndef DYNAMIC_ARRAY_H 2 #define DYNAMIC_ARRAY_H 3 4 #include<stdio.h> 5 #include<stdlib.h> 6 #include<string.h> 7 //動態增長內存,策略:將存放數據的內存放到?堆上 8 //動態數組 如果5個元素 申請內存 拷貝數據 釋放內存 插入第七個?太麻煩了!!!! 9 //用capacity保存容量 用size記錄當前數組中具體的元素個數 10 11 typedef structDYNAMICARRAY { 12 int *pAddr;//存放數據的地址 13 int size;//當前有多少個元素 14 int capacity;//容量,最大能容納多少個元素 15 }Dynamic_Array; 16 17 //寫一系列的相關對DYNAMICARRAY結構體操作的函數 18 //初始化 19 Dynamic_Array* Init_Dynamic_Array(); 20 //插入 21 void PushBack_Array(Dynamic_Array* arr,int value); 22 //根據位置刪除 23 void RemoveByPos_Array(Dynamic_Array* arr, intpos); 24 //根據值刪除 25 void RemoveByValue_Array(Dynamic_Array* arr, int value); 26 //查找 27 int Find_Array(Dynamic_Array* arr,int value); 28 //打印 29 void Print_Array(Dynamic_Array* arr); 30 //釋放動態數組的內存 31 void FreeSpace_Array(Dynamic_Array* arr); 32 33 //清空數組 34 void Clear_Array(Dynamic_Array* arr); 35 //獲取動態數組容量 36int Capacity_Array(Dynamic_Array* arr); 37 //獲取動態數據當前元素個數 38 int Size_Array(Dynamic_Array* arr); 39 //根據位置獲得某個位置元素 40 int At_Array(Dynamic_Array* arr, int pos); 41 #endif
DynamicArray.c
1 #include"DynamicArray.h" 2 3 //初始化 4 Dynamic_Array* Init_Dynamic_Array() { 5 //申請內存 6 Dynamic_Array* myArray = (Dynamic_Array*)malloc(sizeof(Dynamic_Array)); 7 //初始化 8 myArray->size = 0; 9 myArray->capacity = 20; 10 myArray->pAddr = (int*)malloc(sizeof(int)*myArray->capacity); 11 12 13 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 //第一步 申請一塊更大的內存空間 新空間是舊空間的兩倍 24 25 int* newSpace = (int*)malloc(sizeof(int)*arr->capacity * 2); 26 //第二步 拷貝數據到新的空間 27 memcpy(newSpace, arr->pAddr, arr->capacity*sizeof(int)); 28 //釋放舊空間的內存 29 free(arr->pAddr); 30 //更新容量 31 arr->capacity = arr->capacity * 2; 32 arr->pAddr = newSpace; 33 } 34 //插入新元素 35 arr->pAddr[arr->size] = value; 36 arr->size++; 37 38 } 39 //根據位置刪除 40 void RemoveByPos_Array(Dynamic_Array* arr, int pos) { 41 if (arr == NULL) { 42 return; 43 } 44 //判斷位置是否有效 45 if (pos < 0 || pos >= arr->size) { 46 return; 47 } 48 //刪除元素 如果刪除不是最後位置,將刪除位置後繼元素前移 49 for (int i = pos; i < arr->size-1; i++) 50 arr->pAddr[i] = arr->pAddr[i+1]; 51 arr->size--; 52 53 } 54 //根據值刪除value第一次出現的位置 55 void RemoveByValue_Array(Dynamic_Array* arr, int value) 56 { 57 if (arr == NULL) { 58 return ; 59 } 60 //找值的位置 61 int pos = Find_Array(arr,value); 62 //int pos = -1; 63 //for (int i = 0; i < arr->size; i++) { 64 // if (arr->pAddr[i] == value) { 65 // pos = i; 66 // break; 67 // } 68 //} 69 70 //根據位置刪除 71 RemoveByPos_Array(arr, pos); 72 73 } 74 //查找value的位置 75 int Find_Array(Dynamic_Array* arr, int value) { 76 if (arr == NULL) { 77 return -1; 78 } 79 //找值的位置 80 int pos = -1; 81 for (int i = 0; i < arr->size; i++) { 82 if (arr->pAddr[i] == value) { 83 pos = i; 84 break; 85 } 86 } 87 return pos; 88 } 89 90 91 //打印 92 void Print_Array(Dynamic_Array* arr) { 93 if (arr == NULL) { 94 return; 95 } 96 for (int i = 0; i < arr->size; i++) 97 { 98 printf("%d ",arr->pAddr[i]); 99 } 100 printf("\n"); 101 102 } 103 //釋放動態數組的內存 104 void FreeSpace_Array(Dynamic_Array* arr) { 105 if (arr == NULL) { 106 return; 107 }//讓程序更健壯 108 109 if (arr->pAddr != NULL) { 110 free(arr->pAddr); 111 } 112 113 free(arr); 114 } 115 //清空數組 116 void Clear_Array(Dynamic_Array* arr) { 117 if (arr == NULL) { 118 return; 119 } 120 //pAddr->空間 121 arr->size = 0; 122 123 } 124 125 //獲取動態數組容量 126 int Capacity_Array(Dynamic_Array* arr) { 127 if (arr == NULL) { 128 return -1; 129 } 130 131 132 return arr->capacity; 133 }//獲取動態數據當前元素個數 134 int Size_Array(Dynamic_Array* arr) { 135 136 if (arr == NULL) { 137 return -1; 138 } 139 return arr->size; 140 } 141 //根據位置獲得某個位置元素 142 int At_Array(Dynamic_Array* arr, int pos) { 143 return arr->pAddr[pos]; 144 }
main.c
1 #define _CRT_SECURE_NO_WARNINGS 2 #include<stdio.h> 3 #include<stdlib.h> 4 #include<string.h> 5 #include"DynamicArray.h" 6 7 void test01() { 8 //初始化動態數組 9 Dynamic_Array* myArray = Init_Dynamic_Array(); 10 //打印容量 11 printf("數組容量:%d\n", Capacity_Array(myArray)); 12 printf("數組大小:%d\n", Size_Array(myArray)); 13 //插入元素 14 for (int i = 0; i < 30; i++) 15 { 16 PushBack_Array(myArray, i); 17 } 18 printf("數組容量:%d\n", Capacity_Array(myArray)); 19 printf("數組大小:%d\n", Size_Array(myArray)); 20 //打印 21 Print_Array(myArray); 22 23 //刪除 24 RemoveByPos_Array(myArray,0); 25 RemoveByValue_Array(myArray,27); 26 //打印 27 Print_Array(myArray); 28 29 //查找 30 int pos = Find_Array(myArray, 5); 31 printf("5查找到:pos:%d %d\n", pos, At_Array(myArray, pos)); 32 33 //銷毀 34 FreeSpace_Array(myArray); 35 } 36 37 38 int main() 39 { 40 41 test01(); 42 system("pause"); 43 return 0; 44 }
vs2015運行結果:
12、順序表的順序存儲結構