数据结构

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
View Code

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 }
View Code

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 }
View Code

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 }
View Code

二维动态矩阵应用举例:

  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 }

原文地址:https://www.cnblogs.com/winslam/p/9519628.html