自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(51)
  • 收藏
  • 关注

原创 AVLTree(二叉平衡树)——数据结构

平衡二叉树如果二叉搜索树的插入序列是有序的或者是接近有序,那么二叉搜索树就会退化为单支数(类似单链表),查找元素相当于在顺序表中搜索元素,效率低下。AVLtree(Adelson Velskii Landis tree)是一个加上额外平衡条件的二叉搜索树,左右子树高度之差(简称平衡因子)的绝对值不超过1,如果它有n个节点,高度可保持在O(logn),搜索时间复杂度为O(logn)。AVL树的节点template<class K, class V>struct AVLTreeNode{

2021-03-23 22:42:26 227

原创 二叉搜索树(binary search tree)——数据结构

二叉搜索树二叉搜索树(Binary Search Tree),任何节点的键值一定大于其左子树中每一个节点的键值,并且小于其右子树中的每一个节点的键值。二叉搜索树或者是一颗空树,或者是具有以下性质的二叉树:若它的左子树不为空,则左子树上的所有节点的键值小于根节点的键值若它的左子树不为空,则右子树上的所有节点的键值大于根节点的键值它的左右子树也分别为二叉搜索树插入若树为空,则直接插入若树不为空,从根节点开始,遇到键值较大的则向左,遇到键值较小的则向右,直到尾端,插入新的节点//非递归

2021-03-21 18:17:33 440

原创 string类——C++

string类string在底层实际是:basic_string模板类的别名,typedef basic_string<char, char_traits, allocator> string;在使用string类时,必须包含#include头文件以及using namespace std;string常见接口string的其中一个缺点是,插入数据,空间不够需要增容,增容是有性能消耗。常见构造string()构造空的string类对象,即空字符串string(cons

2021-03-20 00:03:10 227

原创 智能指针(auto_ptr、unique_ptr、shared_ptr、weak_ptr)——C++

智能指针C++中堆内存的申请和释放都由程序员自己管理,程序员自己管理堆内存可以提高程序的效率,但是容易造成问题:忘记delete内存:会导致内存泄漏问题,而且除非内存耗尽否则很难检测到这种错误使用已经释放的对象:在释放掉内存后将指针置为空,并且下一次使用前判空同一块内存释放两次:如果有两个指针指向相同的动态分配空间,就会造成这种错误发生异常时的内存泄漏:若在new和delete之间发生异常,则会导致内存泄漏C++引入了智能指针来解决这种问题。RAIIRAII(Resource Acqui

2021-03-20 00:00:34 240

原创 模板——C++

模板泛型编程泛型编程:编写与类型无关的通用代码,是代码复用的一种手段。模板(函数模板和类模板)是泛型编程的基础。函数模板函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特定类型版本。函数模板格式template<typename T>//关键字<模板参数(类型)>void Swap(T& left,T& right){ }//返回值类型 函数名(参数列表)typename是用来定义模板参数关键

2021-03-19 23:58:41 146

原创 数据库索引为什么是B+树

索引索引(Index)是帮助MySQL高效获取数据的数据结构。帮助我们快速匹配查找到需要的数据行,相当于书本里的目录。索引数据结构哈希存储引擎会为每一行计算一个hash码,并且不同键值行的hash码通常是不同的,hash索引中存储的就是hash码,hash码彼此之间是没有规律的,且Hash操作不能保证顺序性,值接近的两个数据,hash码可能相差很远,被分到不同的桶中。所以Hash索引,单条记录的查询的效率很高,时间复杂度为O(1),但是不适合范围查询。二分查找二分查找是给定一个有序数组,在查找过

2021-03-03 18:20:03 209 1

原创 HTTP、HTTPS协议——Linux网络编程

HTTP协议HTTP 全称 HyperText Transfer Protocol超文本传输协议,超文本即超越普通文本的文本,即音视频、图片、文件的混合体。URLURL(Uniform Resourse Locator)统一资源定位符协议方案名:通信双方指定的协议名主机名和密码:对用户进行认证域名:服务器的主机名或IP地址端口:服务段侦听的端口,省略时使用默认端口HTPP使用80端口,HTTPS使用443端口资源路径:资源在主机上的存放路径,"/"是服务器定义的逻辑上的根目录查询字符串

2021-02-23 22:31:28 369

原创 UDP、TCP协议——Linux网络编程

UDP协议UDP的全称是用户数据报协议(User Datagram Protocol),UDP为应用程序提供了一种无需建立连接就可以发送数据包的方法。UDP协议头部格式源端口:发送数据包的应用程序所使用的端口目的端口:接收数据包的应用程序使用的端口数据长度:表示UDP数据包的长度,包含UDP头部长度和UDP数据长度;UDP报文头长度是8个字节,所以这个值最小为8,最大长度为65535字节校验和:检验UDP数据在传输过程中是否有损坏,如果有损坏,则不会提交给应用层,而是直接丢弃。如何通过检

2021-02-23 22:29:19 308

原创 网络基础2(ARP、NAT、DNS协议)——Linux网络编程

ARP协议ARP协议只在子网内部有效以太网首部以太网目的地址:ARP请求的目的MAC地址,填充为全1,表示广播地址以太网源地址:ARP请求主句的MAC地址帧类型:以太网数据帧协议,表示上层使用什么协议;IP协议——0x0800,ARP请求或应答——0x080628字节的请求或应答硬件类型:定义运行ARP的网络类型协议类型:表示使用什么协议,IP地址转换MAC地址的硬件地址长度:表示MAC地址的长度协议地址长度:表示IP地址的长度OP:表示是ARP请求还是ARP应答,1表示请求,

2021-02-23 22:22:40 290

原创 IP协议——Linux网络编程

IP协议IP头部格式版本号:4位,IP协议的版本首部长度:4位,4个比特位计算出来的值乘4等于首部的长度复位类型:8位,前三个比特位表表示优先权,但是已经弃用了;后面的4个比特位分别表示:最小延迟+最大吞吐量+最高可用性+最小费用,这四个比特位是一个互斥的关系,一般都是0,表示默认属性;最后一个比特位是保留位,必须置为0总长度:16位,表示IP数据包中首部和数据的总和长度,总长度大小为65536,传输长度大于这个字节就需要分片标识:16位,维持一个计数器,每产生一个数据包,计数器就加1,当进

2021-02-23 21:04:22 149

原创 网络基础1(协议、协议模型、IP、Port、网络字节序)——Linux网络编程

网络基础按照网络覆盖范围划分为:局域网、城域网、广域网协议协议是指通信双方约定使用同一种解析信息的手段来进行有效的沟通网络协议:计算机网络中,通信双方对进行数据交换和数据传输而建立的规则、标准或者做出的约定,指定一个通信协议标准计算机当中有很多不同的网络协议,将一系列的协议称之为协议簇参考模型:定义各个协议之间的关系,并且划分了每个协议需要完成的任务协议分层模型OSI参考模型(自下而上):物理层、数据链路层、网络层、传输层、会话层、表示层、应用层TCP/IP五层模型:物理层、数据

2021-02-19 20:27:03 962

原创 设计模式(单例模式)——Linux系统编程

设计模式设计模式的优点代码复用程度高程序比较可靠,并且容易理解代码框架比较稳定设计模式的分类创建型模式——单例模式结构型模式——适配器模式行为型模式——观察者模式单例模式特点:全局提供唯一一个类的实例,具有全局变量的特点使用场景:内存池+数据池基础的要点全局只有一个实例——static+禁止构造+禁止拷贝构造+禁止赋值拷贝线程安全调用者是通过类的函数来获取实例具体的实现饿汉模式——程序启动的时候进行初始化,资源在程序启动的时候就全部加

2021-02-19 15:46:25 886

原创 线程池——Linux系统编程

线程池线程池=线程安全队列+一大堆的线程(消费线程)线程池中的线程,都是同一种角色的线程,每一个线程都执行同样的入口函数线程安全队列中的元素,保存待处理的数据和处理数据的方式如何让相同入口函数的线程,处理不同的请求switch case:处理大量不同的需求的时候,比较麻烦向线程池抛入数据的时候,将处理该数据的函数一起抛入(函数地址),线程池当中的线程只需要调入传入的处理函数处理传入的数据即可#include <iostream>

2021-02-19 15:45:10 1011

原创 线程安全(互斥锁、条件变量、信号量、读写锁)——Linux系统编程

线程安全多个线程同时运行,访问临界资源,不会导致程序结果产生二义性,这样的情况是线程安全的。临界资源:多线程执行流共享的资源叫临界资源。临界区:每个线程内部访问临界资源的代码访问:在临界区当中对临界资源进行非原子操作原子操作:不会为任何调度机制打断的操作,该操作只有两种状态,要么完成,要么未完成。线程不安全的原理举个栗子:我们规定一个场景假设现在在同一个程序当中有两个线程,线程A和线程B,并且有一个int类型全局变量,值为10;线程A和线程B在各自的入口函数当中对这样一个变量进行++操作。

2021-02-18 17:38:49 1096

原创 生产者消费者模型——Linux系统编程

生产者与消费者模型123规则:1个线程安全的队列+2种角色的线程+3种关系(生产者与生产者互斥+消费者与消费者互斥+生产者与消费者同步加互斥)优点可以解耦合:生产者和消费者都是通过队列进行交互支持忙闲不均:(队列起到了缓冲的作用)支持并发:消费者只关心队列当中是否有数据可以进行消费,生产者只关心队列当中是否有空闲的结点可以进行生产实现队列,借助STL当中的queue线程安全的队列:std::queue并不是一个线程安全的,互斥,使用互斥锁;同步,使用条件变量两种角色的线程:生产者线程

2021-02-16 23:17:50 612

原创 线程控制(创建、终止、等待、分离)——Linux系统编程

线程线程是什么?从进程角度来看:线程是一个进程内部的控制序列;线程在进程内部运行,本质是在进程的虚拟地址空间内运行;一切进程至少都有一个执行线程;从资源分配角度来看:在Linux系统中,线程的PCB比传统进程更加轻量化;透过虚拟地址空间,可以看到进程的大部分资源被合理分配给每个执行流,就形成了线程执行流;从内核角度来看:在Linux系统中,线程被称为轻量级进程,在内核当中也是创建了task_struct结构体来描述线程,现成的task_struct结构体当中的内存指针指向

2021-02-13 21:26:42 848

原创 实现一个minishell小程序

minishell的实现实现逻辑从标准输入当中读取数据(要执行的可执行程序)拆分可执行程序名称和命令行参数,我们认为从标准输入当中读取到的内容第一个空格之前的数据是可执行程序的名称,第一个空格之后的内容都认为是命令行参数创建子进程,子进程程序替换可执行程序在子进程程序替换时间内,让父进程进行等待进程等待isspace()函数,判断一个字符是否有空白字符(空格、换页符、换行符、回车、水平指标符、垂直制表符)返回值,返回0为没有读到了空白字符,返回非0读到了空白字符代码实现#incl

2021-02-09 19:13:02 985

原创 多态的学习——C++

多态多态是不同继承关系的类对象,去调用同一函数,产生了不同行为。多态的定义和实现构成条件必须通过基类的指针或者引用调用虚函数被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写虚函数虚函数——被virtual修饰的类成员函数虚函数的重写(覆盖)——派生类中有一个跟基类完全相同的虚函数(即派生类虚函数与基类虚函数的返回值类型、函数名字、参数列表完全相同),称子类的虚函数重写了基类的虚函数虚函数重写的两个例外:协变——派生类重写基类函数时,与基类虚函数返回值类型不同。即基类虚

2020-11-05 13:33:00 911

原创 继承的学习——C++

继承继承(inheritance)机制是面向对象程序设计代码复用的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,我们成为派生类。继承定义定义格式继承方式和访问限定符继承方式public继承、protected继承、private继承访问限定符public访问、protected访问、private访问继承基类成员访问的变化[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xU1mncYB-16045540488

2020-11-05 13:29:35 886

原创 STL应用之stack、queue、priority_queue容器适配器

stackstack是一种container adapter(容器适配器),以某种既有容器作为底层结构,将其接口改变,使之符合先进后出(Frist In Last Out,FILO)的特点,默认情况下使用deque(双端队列)作为底层容器。stack的使用stack()构造空的栈bool empty()如当前堆栈为空,返回 true 否则返回falsesize_t size()返回当前堆栈中的元素数目value_type& top()返回对栈顶元素的引用

2020-11-01 11:51:01 874

原创 STL应用之list容器——C++

listlist允许在序列中的任何位置进行插入和删除,并且在前后两个方向进行迭代list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素list是为补充vector的缺点存在的,vector的缺点:1、头部和中部的插入效率低,O(N)需要挪动数据;2、插入数据空间不够需要增容,增容时需要开辟新空间、拷贝数据和释放旧空间,会付出很大的代价;vector的优点:1、支持下标的随机访问,简介的就很好的支持排序、二分查找和堆算

2020-10-30 21:21:18 768

原创 STL应用之vector容器——C++

vectorvector的定义vector()无参构造函数,构造一个空的vectorvector(size_type num, const value_type& val = value_type())构造一个初始放入num个值为val的元素的Vectorvector(const vector& from)拷贝构造函数#include<iostream>#include<vector>using namespace std;

2020-10-22 23:56:34 1910

原创 内存管理——C++

内存管理内存分布栈又叫堆栈,非静态局部变量/函数参数、返回值等,栈是向下增长的内存映射段是高效的IO映射方式,用于装载一个共享的动态内存库。用户可以使用系统接口创建共享内存,做进程间通信堆用于程序运行时动态内存分配,堆是可以上增长的数据段存储全局数据和静态数据代码段可执行的代码/只读常量int globalVar = 1;//数据段static int staticGlobalVar = 1;//数据段void Test(){ static int staticVar = 1;//

2020-10-07 12:22:01 2555

原创 类和对象(3)——C++

类和对象(3)构造函数(下)函数体内赋值在创建对象时,编译器通过调用构造函数,给对象中各个成员变量一个合适的初始值。Date(int year=0,int month=1.int day=1){ //函数体内赋值 _year=year; _month=month; _day=day;}初始化列表初始化列表:以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个"成员变量"后面跟一个放在括号中的初始值或表达式。Date(int year=0;int mon

2020-10-02 17:54:27 1597

原创 类和对象(2)——C++

类和对象(2)类的默认成员函数任何一个类在我们不写的情况下,都会自动生成下面6个默认成员函数初始化和清理构造函数——完成初始化工作析构函数——完成清理工作拷贝和复制拷贝构造——使用同类对象初始化创建对象赋值重载——把一个对象复制给另一个对象取地址重载主要是普通对象和const对象取地址构造函数构造函数是一个特殊的成员函数,名字与类名相同,创建类类型对象时由编译器自动调用,保证每个数据成员都有一个合适的初始值,并且在对象的生命周期内只调用一次。特性函数名与类

2020-09-26 13:47:06 1607

原创 类和对象(1)——C++

类与对象(1)类的定义class className{ //类体:由成员函数和成员变量组成};//后面加分号class为定义类的关键字,className为类的名字,{}中为类的主体类中的元素称为类的成员;类中的数据称为类的属性或者成员变量;类中的函数称为类的方法或者成员函数;定义方式声明和方法全部在类体中class student{ void show() //显示信息 { cout<<name<<"

2020-09-13 21:08:39 1608

原创 Linux下MySQL的安装——Linux

mariadb的安装查看本地是否安装了mariadbrpm -qa | grep mariadb安装mariadb客户端和服务端yum -y install mariadb-serveryum -y install mariadb-devel查看mariadb的状态service mariadb status 启动mariadbservice mariadb start可以使用ps aux | grep mysqld查看MySQL是否启动系统先启动守护进程,拉

2020-09-08 10:32:53 1679

原创 Xshell连接虚拟机详细教程

Xshell连接虚拟机1、打开虚拟机终端,输入下面命令,找到ens33对应的IP地址,如图ifconfig2、打开Xshell,打开文件–>新建3、填写名称,主机这里填入刚才的IP,点击连接4、输入登录的用户名,点击确定5、输入密码,点击确定6、连接成功,可以开始使用...

2020-06-28 09:49:39 54840 10

原创 虚拟机(VM15)安装Centos7详细教程

虚拟机(VM15)安装Centos7教程1.打开VM15,点击创建新的虚拟机2.点击下一步3.这里选择稍后安装操作系统,点击下一步4.选择要安装的操作系统,这里我们是Centos 7 64位5.更改虚拟机文件存放的位置,点击下一步6.磁盘大小默认20GB就好,点击下一步7.点击完成8.这里需要设置镜像文件9.使用IOS镜像文件,点击确定10.开启虚拟机11.选择简体中文,点击继续12.点击软件选择13.选择桌面和开发工具,点击完成14.点击安装位置1

2020-06-27 23:24:57 3427

原创 进程信号——Linux系统编程

文章目录进程信号信号的概念信号的种类信号的生命周期信号的产生信号的注册信号的注销信号的处理方式执行默认动作忽略(丢弃)捕获处理信号的阻塞进程信号信号的概念信号是一个软件中断,打断当前的正在运行的进程,让该进程去处理信号的事件。信号的种类使用kill -l命令查看信号Linux操作系统中,总共有62种信号前1-31,不可靠信号,信号有可能会丢失,非实时信号后34-64,可靠信号,信号不可能被丢失的,实时信号,它们没有固定的含义(可以由用户自定义)。所有的实时信号的默认动作都为终止进程。

2020-06-10 20:05:38 2706 2

原创 进程间通信(管道、共享内存、消息队列、信号量)—Linux系统编程

文章目录进程间通信管道(pipe)匿名管道的特性创建匿名管道命名管道(FIFO)命名管道的创建使用命令创建命名管道mkfifo()函数创建命名管道命名管道的特性system V共享内存创建共享内存通信的流程共享内存的特性创建和使用的接口创建共享内存将进程附加到共享内存上从共享内存当中分离共享内存的销毁ipcs:可以查看共享内存消息队列消息队列的特性消息队列通信的过程打开或创建一个队列将数据放到消息队列中从消息队列中获取消息信号量工作机制进程间通信管道(数据传输)、共享内存(数据共享)、消息队列(数据传输

2020-06-09 00:08:53 1520

原创 文件I/O(标准IO、系统IO、文件描述符、重定向、ext2文件系统)——Linux系统编程

文章目录基础IOC语言中的文件操作fopen(打开文件)fread(从文件流读取数据)fwrite(将数据写至文件流)fseek(移动文件流的读写位置)fclose(关闭文件)系统调用的文件操作open(打开文件)write(将数据写入以打开的文件)read(由已打开的文件读取数据)lseek(移动文件的读写位置)close(关闭文件)库函数和系统调用接口系统调用库函数文件描述符重定向命令操作的重定向dup2和dupdup2(复制文件描述符)dup(复制文件描述符)基础IOC语言中的文件操作fopen

2020-06-07 20:47:02 2265

原创 进程控制(创建、终止、退出、进程程序替换)——Linux系统编程

文章目录进程控制进程创建fork函数getpid/getppid函数进程终止正常终止异常退出进程等待waitwaitpid进程程序替换原理exec函数进程控制进程创建fork函数fork函数:创建一个新进程#include <unistd.h>pid_t fork(void);返回值:成功时,父进程返回子进程id,子进程返回0失败时,返回-1注意:不是fork函数能返回两个值,而是fork后,fork函数变为两个,父子各需要返回一个。getpid/getppid函数

2020-06-05 22:42:29 1547

原创 进程概念——Linux系统编程

文章目录进程概念进程和程序进程运行特性进程状态转换进程控制块PCB进程地址空间进程常用命令killps孤儿进程僵尸进程环境变量常见环境变量查看环境变量方法进程概念进程和程序程序:是指编译好的二进制文件,在磁盘上,不占用进程:是正在执行的(动态的)程序,占用系统资源,在内存中执行。进程是分配系统资源的基本单位。区别程序是静态的,进程是动态的;程序一般保存在磁盘中,不占用系统资源,进程会占用系统资源一个程序可以对应多个进程,一个进程可以执行一个或多个程序进程具有并发性,而程序没有程序没

2020-06-05 18:10:14 2521

原创 gcc、gdb、make的使用——Linux

文章目录gcc/g++:编译器功能编译过程gdb:调试器功能使用make/Makefile:项目自动化构建工编写规则执行规则预定义变量gcc/g++:编译器功能​ 将C/C++高级语言代码翻译成机器可识别的代码编译过程预处理(进行宏替换)宏定义展开,头文件展开、条件编译等,同时将代码中的注释删除eg:gcc -E hello.c -o hello.i编译(生成汇编)检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,把代码翻译成汇编语言eg:gcc -

2020-06-01 23:19:33 2133

原创 排序Sort——数据结构

文章目录排序——数据结构排序排序的稳定性直接插入排序直接插入的实现直接插入的特点希尔排序希尔排序的实现希尔排序的特点简单选择排序简单选择的实现简单选择的特点堆排序堆排序的实现堆排序的特点冒泡排序冒泡排序的实现冒泡排序的特点快速排序快速排序的实现归并排序归并排序的实现归并排序的特点计数排序计数排序的实现计数排序的特点排序——数据结构排序假设含有n个记录的序列为{r1,r2,……,rn},其相应的关键字分别为{k1,k2,……,kn},需要确定一种排列,使其相应的关键字满足非递增或非递减关系,即使得序列成

2020-05-29 02:46:22 1655 1

原创 二叉树和堆——数据结构

二叉树——数据结构树树的定义树(Tree)是n(n>=0)个结点的有限集。n=0时称为空树。在任意一颗非空树中:有且仅有一个特定的称为根(root)的结点;当n>1时,其余结点课分为m(m>0)个互不相交的有限集,其中每一个集合本身又是一棵树,并且称为根的子树。结点结点拥有的子树数称为结点的度(Degree)。度为0的结点称为叶结点或者终端结点。树的度是树内各结点的度的最大值。结点的子树的根称为该结点的孩子(Child),相应的,该结点称为孩子的双亲(Parent

2020-05-26 15:38:19 1244 1

原创 顺序栈和链队列——数据结构

栈和队列栈栈的定义栈(stack)是限定仅在表尾进行插入和删除操作的线性表。我们把允许数据插入和删除的一端称为栈顶(top),另一端称为栈底(bottom),不含任何数据元素的栈称为空栈。栈又称为后进先出(Last In First Out)的线性表。栈的顺序存储结构栈的实现一般可以使用数组或者链表实现,相对而言数组的结构实现更优一些。因为数组在尾上插入数据的代价比较小。// 支持动态增长的栈typedef int DataType;typedef struct Stack{ Data

2020-05-20 21:31:30 1130

原创 线性表的链式存储——数据结构

线性表的链式存储结构为了表示每个数据元素与其直接后继数据元素之间的逻辑关系,除了存储本身的信息之外,还需存储一个指示其直接后继的信息(即直接后继的存储位置)。我们把存储数据元素信息的位置称为数据域,把存储其直接后继信息的位置称为指针域。这两部分组成数据元素的结点(Node)。头结点和头指针头结点头结点是为了操作的统一和方便而设立的,放在第一元素的节点之前,其数据域一般无意义;有了头结点,对在第一个元素结点前插入和删除第一个结点的操作就与其他结点的操作统一了;头结点不是链表的必须要有的;

2020-05-19 23:03:16 854

原创 线性表的顺序存储——数据结构

线性表——数据结构线性表的定义线性表(List):零个或多个数据元素的有限序列。元素之间是有序的,若存在多个元素,则第一个元素无前驱,最后一个元素无后继,其他每个元素都有且只有一个前驱和后继。线性表的顺序存储指的是用一段地址连续的存储单元依次存储线性表的数据元素。顺序存储结构#define MAXSIZE 20 //初始存储空间分配量typedef int Type;typedef struct{ Type data[MAXSIZE]; //数组存储元素 int length; //

2020-05-18 12:21:07 825

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除