12顺序表的顺序存储结构
Posted 乱丶心
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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("\\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顺序表的顺序存储结构的主要内容,如果未能解决你的问题,请参考以下文章