12、顺序表的顺序存储结构

动态数组实现

动态数组头文件: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("
");
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
", Capacity_Array(myArray));
12     printf("数组大小:%d
", Size_Array(myArray));
13     //插入元素
14     for (int i = 0; i < 30; i++)
15     {
16         PushBack_Array(myArray, i);
17     }
18     printf("数组容量:%d
", Capacity_Array(myArray));
19     printf("数组大小:%d
", 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
", 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运行结果:

原文地址:https://www.cnblogs.com/luanxin/p/8932990.html