• 数据结构


    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 }

  • 相关阅读:
    CCF CSP 题解
    CCF CSP 2019032 二十四点
    CCF CSP 2018121 小明上学
    CCF CSP 2019092 小明种苹果(续)
    CCF CSP 2019091 小明种苹果
    CCF CSP 2019121 报数
    CCF CSP 2019031 小中大
    CCF CSP 2020061 线性分类器
    CCF CSP 2020062 稀疏向量
    利用国家气象局的webservice查询天气预报(转载)
  • 原文地址:https://www.cnblogs.com/winslam/p/9519628.html
Copyright © 2020-2023  润新知