• 数据结构


    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 }

  • 相关阅读:
    java 后端博客系统文章系统——No5
    啃碎并发(11):内存模型之重排序
    java 后端博客系统文章系统——No4
    啃碎并发(10):内存模型之内部原理
    java 后端博客系统文章系统——No3
    啃碎并发(九):内存模型之基础概述
    啃碎并发(八):深入分析wait&notify原理 猿码架构
    快速平方根倒数算法
    查找:哈希表
    注意力机制论文 --- Crop leaf disease recognition based on Self-Attention convolutional neural network
  • 原文地址:https://www.cnblogs.com/winslam/p/9519628.html
Copyright © 2020-2023  润新知