c语言版本
DynamicArray.h
1 #ifndef DYNAMIC_ARRAY_H 2 #define DYNAMIC_ARRAY_H 3 4 5 //#ifdef __cplusplus //告诉编译器,这部分代码按C语言的格式进行编译,而不是C++的 6 //extern "C"{ 7 //#endif 8 9 #include<stdlib.h> 10 #include<stdio.h> 11 #include<string.h> 12 13 // 动态增长内存,将存放的数据的内存放在哪? 堆上 14 15 // 申请内存 拷贝数据 释放内存 - > 效率太低; 16 // capacity :内存空间一共可以存放多少个元素 17 // size : 记录元素个数 18 19 // 动态数组结构体 20 typedef struct DYNAMICARRAY 21 { 22 int* pAddr;//存放数据地址 23 int size; // 当前元素个数, 类似 vector.size(); 24 int capacity;// 类似 vector.capacity(); 25 }Dynamic_Array; 26 //写出一系列相关堆DYNAMICARRAY结构体操作的函数 27 //初始化 28 Dynamic_Array* Init_Array(); 29 //插入 30 void PushBack_Array(Dynamic_Array* arr, int value); 31 //根据位置删除 32 void RemoveByPos_Array(Dynamic_Array* arr, int pos); 33 //根据值删除 34 void RemoveByValue_Array(Dynamic_Array* arr, int value); 35 //查找 36 int Find_Array(Dynamic_Array* arr, int value); 37 //打印 38 void Print_Array(Dynamic_Array* arr); 39 //释放动态数组内存 40 void FreeSpace_Array(Dynamic_Array* arr); 41 //清空数组 42 void Clear_Array(Dynamic_Array* arr); 43 //获得Capacity 44 int Capacity_Array(Dynamic_Array* arr); 45 //获取size 46 int Size_Array(Dynamic_Array* arr); 47 //根据位置获取元素 48 int At_Array(Dynamic_Array* arr, int pos); 49 50 //#ifdef __cplusplus 51 //} 52 //#endif 53 54 55 56 #endif // !DYNAMIC_ARRAY_H
DynamicArray.c
1 #include"DynamicArray.h" 2 3 //初始化 4 Dynamic_Array* Init_Array() 5 { 6 // 申请内存 7 Dynamic_Array* myArray = (Dynamic_Array*)malloc(sizeof(Dynamic_Array));//强制转换 将void* 转换成 Dynamic_Array* 8 //初始化 9 myArray->size = 0; 10 myArray->capacity = 20; 11 myArray->pAddr = (int*)malloc(sizeof(int)*myArray->capacity); 12 return myArray;//返回指针 13 } 14 //插入 15 void PushBack_Array(Dynamic_Array* arr, int value) 16 { 17 if (arr == NULL) 18 return; 19 20 // 判断空间是否足够 21 if (arr->size == arr->capacity) 22 { 23 // <1>申请更大的内存空间, 新空间是旧空间的两倍 24 int* newSpace = (int*)(malloc(sizeof(int)*arr->capacity*2)); 25 // <2>拷贝数据到新的空间 26 memcpy(newSpace,arr->pAddr, arr->capacity*sizeof(int)); 27 // <3>释放旧空间 28 free(arr->pAddr); 29 // <4>更新容量和地址 30 arr->capacity *= 2; 31 arr->pAddr = newSpace; 32 } 33 // 插入新元素 34 arr->pAddr[arr->size] = value; 35 arr->size++; 36 } 37 //根据位置删除 38 void RemoveByPos_Array(Dynamic_Array* arr, int pos) 39 { 40 if (arr->pAddr == NULL) 41 return; 42 43 if (pos < 0 || pos >= arr->size) // pos 越界 44 return; 45 46 //删除元素 47 // 1 2 3 4 5 6 7 8 48 // 比如删除 6,我们就直接将6后面的元素向前挪一个位置,覆盖6 49 for (int i = pos; i < (arr->size - 1); i++) 50 { 51 arr->pAddr[i] = arr->pAddr[i + 1]; 52 } 53 arr->size--;//最初数组最后一个元素的位置没了 54 } 55 //根据值删除 56 void RemoveByValue_Array(Dynamic_Array* arr, int value) 57 { 58 if (arr == NULL) 59 return; 60 61 //找到值得位置 62 int pos = Find_Array(arr,value); 63 if (pos == -1) 64 { 65 return; 66 } 67 // 根据位置删除 68 RemoveByPos_Array(arr, pos); 69 } 70 71 72 //查找 73 int Find_Array(Dynamic_Array* arr, int value) 74 { 75 if (arr == NULL) 76 return -1; 77 //找到值得位置 78 int pos = -1; 79 for (int i = 0; i < arr->size; i++) 80 { 81 if (arr->pAddr[i] == value) 82 { 83 pos = i; 84 break; 85 } 86 } 87 return pos; 88 } 89 //打印 90 void Print_Array(Dynamic_Array* arr) 91 { 92 if (arr == NULL) 93 return; 94 95 for (int i = 0; i < arr->size; i++) 96 { 97 printf("%d ", arr->pAddr[i]); 98 } 99 printf(" "); 100 } 101 //释放动态数组内存 102 void FreeSpace_Array(Dynamic_Array* arr) 103 { 104 if (arr == NULL) 105 return; 106 107 if (arr->pAddr != NULL) 108 { 109 free(arr->pAddr);// 释放指针 110 } 111 free(arr);// 释放结构体 112 } 113 //清空数组 114 void Clear_Array(Dynamic_Array* arr) 115 { 116 if (arr == NULL) 117 return; 118 119 arr->size = 0; 120 } 121 //获得Capacity 122 int Capacity_Array(Dynamic_Array* arr) 123 { 124 if (arr == NULL) 125 return -1; 126 127 return arr->capacity; 128 } 129 //获取size 130 int Size_Array(Dynamic_Array* arr) 131 { 132 if (arr == NULL) 133 return -1; 134 135 return arr->size; 136 } 137 //根据位置获取元素 138 int At_Array(Dynamic_Array* arr, int pos) 139 { 140 return arr->pAddr[pos]; 141 }
01动态数组.c
1 #include<stdlib.h> 2 #include<stdio.h> 3 #include<string.h> 4 5 #include"DynamicArray.h" 6 7 void test01() 8 { 9 //初始化动态数组 10 Dynamic_Array* myArray = Init_Array(); 11 //打印容量 12 printf("数组容量:%d ", Capacity_Array(myArray)); 13 printf("数组大小:%d ", Size_Array(myArray)); 14 //插入元素 15 for (int i = 0; i < 30; i++) 16 { 17 PushBack_Array(myArray, i); 18 } 19 //打印容量 20 printf("数组容量:%d ", Capacity_Array(myArray)); 21 printf("数组大小:%d ", Size_Array(myArray)); 22 // 打印 23 Print_Array(myArray); 24 //删除 25 RemoveByPos_Array(myArray, 1); 26 RemoveByValue_Array(myArray, 27); 27 Print_Array(myArray); 28 //查找第5个位置 29 int pos = Find_Array(myArray, 5); 30 printf("第%d个元素 = %d",pos, At_Array(myArray, pos)); 31 //销毁 32 FreeSpace_Array(myArray); 33 } 34 35 int main() 36 { 37 test01(); 38 return 1; 39 }
c++版本
dynamic_array_1_dim.cpp
1 #include<iostream> 2 3 using namespace std; 4 5 namespace MY 6 { 7 class Vector 8 { 9 public: 10 Vector(); 11 ~Vector(); 12 void push_back(int value); 13 void removeByPose(int pos); 14 void removeByValue(int value); 15 int find(int value); 16 int& operator[](int index)// 必须是返回引用 17 { 18 return array_[index]; 19 } 20 void show() const; 21 void clear() 22 { 23 size_ = 0; 24 } 25 bool empty() 26 { 27 if (array_ == nullptr) 28 return true; 29 else 30 return false; 31 } 32 public: 33 int* array_; 34 int size_; 35 int capacity_; 36 }; 37 38 Vector::Vector() 39 { 40 size_ = 0; 41 capacity_ = 10; 42 array_ = new int[capacity_]; 43 } 44 Vector::~Vector() 45 { 46 delete[] array_; 47 cout << "free " << array_ << endl; 48 } 49 void MY::Vector::push_back(int value) 50 { 51 if (empty()) return; 52 //判断空间是否足够 53 if (size_ == capacity_) 54 { 55 int* newspace = new int[capacity_ * 2]; // 扩容 56 memcpy(newspace, array_, capacity_ * sizeof(int));// 备份 - > newsapce 57 delete[] array_;// 删除旧空间 58 capacity_ *= 2;//扩容 59 array_ = newspace;//转移旧空间的值 - > 新空间 60 } 61 //在末尾插入元素 62 array_[size_] = value; 63 size_++; 64 } 65 void MY::Vector::show() const 66 { 67 cout << "size_ = " << size_ << " ||"; 68 for (int i = 0; i < size_; i++) 69 { 70 cout << array_[i] << " "; 71 } 72 cout << endl; 73 } 74 void MY::Vector::removeByPose(int pos) 75 { 76 if (empty()) return; 77 if (pos < 0 || pos >= size_)//越界 78 { 79 cout << "out of range!" << endl; 80 return; 81 } 82 for (int i = pos; i < (size_ - 1); i++) //0 1 2 3 4 5 6 7 8 9 83 { 84 array_[i] = array_[i + 1]; 85 } 86 size_--; 87 } 88 int MY::Vector::find(int value) 89 { 90 if (empty()) return -1; 91 int pos = -1; 92 for (int i = 0; i < size_; i++) 93 { 94 if (array_[i] == value) 95 { 96 pos = i; 97 break; 98 } 99 } 100 return pos; 101 } 102 void MY::Vector::removeByValue(int value) 103 { 104 if (empty()) return; 105 int pos = find(value); 106 if (pos == -1) 107 { 108 cout << "没有元素:" << value << endl; 109 return; 110 } 111 removeByPose(pos); 112 } 113 } 114 115 int main() 116 { 117 // 参考别人博客:https://blog.csdn.net/qq_26816591/article/details/52214313 118 //// 我的博客: https://www.cnblogs.com/winslam/articles/9146832.html 119 //int *p1 = new int; //在自由存储区开辟一个int变量 120 //int *p2 = new int[10];//在自由存储区开辟一个int数组,有10个元素 121 //for (int i = 0; i < 10; i++) 122 //{ 123 // p2[i] = i; 124 // cout << "p2 = " << p2[i] << endl; 125 //} 126 //p2[2] = p2[1]; 127 //int *p3 = new int(10);//在自由存储区开辟一个int变量,并初始化为10 128 //cout << "*p3 = " << *p3 << endl; 129 130 MY::Vector vec; 131 for (int i = 0; i < 12; i++) 132 { 133 vec.push_back(i*i); 134 } 135 vec.push_back(88); 136 vec.show(); 137 vec.removeByPose(1); 138 vec.show(); 139 vec.removeByPose(2); 140 vec.show(); 141 vec.removeByValue(49); 142 vec.show(); 143 int position = vec.find(25); 144 //测试重载 145 cout << "test for overload " << endl; 146 for (int i = 0; i < vec.size_; i++) 147 { 148 cout << vec[i] << " "; 149 } 150 cout << endl; 151 152 vec.clear(); 153 vec.show(); 154 return 1; 155 }
二维动态数组初始化与释放的两种方式:
方式一:
1 //【不推荐,因为使用的时候,cols 和 rows 必须指定大小为常数,所以rows cols在函数中不能用作形参】 2 //申请 3 int cols = 200; 4 int rows = 100; 5 uchar (*matrix)[cols]; 6 matrix = new uchar[rows][cols];//450行 800列 7 //释放 8 delete [] matrix;
方式二:
1 //【推荐这种方式:】 2 //申请 3 int **matrix = new int*[rows]; 4 for (int i = 0; i < rows; i++) 5 { 6 matrix[i] = new int[cols]; 7 } 8 //释放 9 for (int i = 0; i < rows; i++) 10 { 11 delete[] matrix[i]; 12 } 13 delete matrix;
方式二Demo:
1 #include<iostream> 2 #include<vector> 3 using namespace std; 4 5 //参考:https://www.cnblogs.com/Sylla-Zhang/archive/2012/10/08/2715300.html 6 7 void printMat(int rows, int cols)// 3 4 8 { 9 //申请空间 10 int **matrix = new int*[rows]; 11 for (int i = 0; i < rows; i++) 12 { 13 matrix[i] = new int[cols]; 14 } 15 //赋值 16 for (int j = 0; j < rows; j++) 17 { 18 for (int i = 0; i < cols; i++) 19 { 20 matrix[j][i] = i + j; 21 cout.width(2); 22 cout << matrix[j][i] << " "; 23 } 24 cout << endl; 25 } 26 //释放 27 for (int i = 0; i < rows; i++) 28 { 29 delete[] matrix[i]; 30 } 31 delete matrix; 32 33 } 34 int main() 35 { 36 printMat(3, 8); 37 return 1; 38 }
二维动态矩阵应用举例:
1 #include<iostream> 2 #include<ctime> 3 using namespace std; 4 5 namespace MY 6 { 7 class Mat 8 { 9 public: 10 Mat(int rows, int cols); 11 ~Mat(); 12 void printf() const; 13 void resize(int rows, int cols); 14 public: 15 int rows_; 16 int cols_; 17 int **matrix; 18 }; 19 Mat::Mat(int rows, int cols):rows_(rows),cols_(cols) 20 { 21 // 申请并分配空间 22 matrix = new int*[rows_]; // 行 23 for (int i = 0; i < rows_; i++) 24 { 25 matrix[i] = new int[cols_]; // 列 26 } 27 // 初始化赋值 28 srand(time(nullptr)); 29 for (int j = 0; j < rows_; j++) 30 { 31 for (int i = 0; i < cols_; i++) 32 { 33 matrix[j][i] = rand()%11; 34 } 35 } 36 } 37 void Mat::resize(int rows, int cols) 38 { 39 //尺寸放大 40 if (rows > rows_ || cols > cols_) 41 { 42 //<1>申请更大空间 43 int **newspace = new int*[rows]; 44 for (int i = 0; i < rows; i++) 45 { 46 newspace[i] = new int[cols]; 47 } 48 //<2>拷贝数据到新的空间// 这里可以用双重遍历,遍历小的旧空间,newspace[j][i] = matrix[j][i]; 49 for (int j = 0; j < rows_; j++)//遍历旧的小空间 50 { 51 memcpy(newspace[j], matrix[j], sizeof(int)*cols); 52 } 53 //<3>释放旧空间 54 for (int i = 0; i < rows_; i++) 55 { 56 delete[] matrix[i]; 57 } 58 delete matrix; 59 cout << "destory the older!" << endl; 60 //<4>填充新的拓展的边缘 61 for (int j = 0; j < rows; j++)//遍历新的大空间 62 { 63 // 新增列的初始化为0 64 if (j < rows_) 65 { 66 for (int i = cols_; i < cols; i++) 67 { 68 newspace[j][i] = 0; 69 } 70 } 71 else// 新增行初始化为0 72 { 73 for (int i = 0; i < cols; i++) 74 { 75 newspace[j][i] = 0; 76 } 77 } 78 } 79 //<5>更新矩阵和行、列 80 matrix = newspace; 81 rows_ = rows; 82 cols_ = cols; 83 } 84 else 85 { 86 cout << "缩小尺寸一个道理,懒得写" << endl; 87 return; 88 } 89 } 90 void Mat::printf() const 91 { 92 for (int j = 0; j < rows_; j++) 93 { 94 for (int i = 0; i < cols_; i++) 95 { 96 cout.width(2); 97 cout << matrix[j][i] << " "; 98 } 99 cout << endl; 100 } 101 cout << endl; 102 } 103 Mat::~Mat() 104 { 105 for (int i = 0; i < rows_; i++)// 注意析构顺序 106 { 107 delete[] matrix[i]; 108 } 109 delete matrix; 110 cout << "destory the Mat()!" << endl; 111 } 112 } 113 114 int main() 115 { 116 MY::Mat mat(6,8);//创建一个6行8列的矩阵 117 mat.printf(); 118 mat.resize(8,10);//拓展边缘,你看下面结果多出来的0全是拓展的行和列 119 mat.printf(); 120 return 1; 121 }