1. 程式人生 > >12、順序表的順序存儲結構

12、順序表的順序存儲結構

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 struct
DYNAMICARRAY { 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, int
pos); 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 //獲取動態數組容量 36
int 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、順序表的順序存儲結構