自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 MySQL基本操作大全

auto_increment:当对应的字段不给值,会自动的被系统触发,系统会从当前字段中已经有的最大值+1操作,得到一个新的不同的值。实际上mysql不对数据操作,所以比delete更快,但是truncate在删除数据的时候,并不是真正的事务,所以无法回滚。如果备份一个数据库时,没有带上-B参数,在恢复数据库的时候,需要先创建空数据库,然后使用数据库,再使用source还原。create table [表名称](字段1 类型,字段2 类型,...., primary key(字段1,字段2));......

2022-08-10 22:30:25 4375 1

原创 平衡树之红黑树

目录红黑树概念红黑树的性质红黑树的插入: 红黑树的验证:与AVL树的比较代码:红黑树,是一种二叉搜索树,但在每个节点上增加一个存储位置表示节点的颜色,可以是red或black。通过对任意一条从根到叶子的路径上各个节点着色方式的限制,红黑树确保没有一条路径会比其他路径长出两倍,因而是接近平衡的,而AVL树是高度平衡的。C++STL中,很多部分(包括set,multiset,map,multimap)的底层都是红黑树。对于任意一颗红黑树,它可以在O(log2 N)时间内做查找,插入和删除,这里的N是树中元素的数

2022-07-02 20:21:40 459

原创 【C++】二叉搜索树 && AVL树

二叉搜索树概念:二叉搜索树又称二叉排序树,它或者是一颗空树,或者是具有以下性质的二叉树:若它的左子树不为空,则左子树上所有节点的值都小于根节点的值。 若它的右子树不为空,则右子树上所有节点的值都大于根节点的值。 它的左右子树也分别为二叉搜索树。二叉搜索树的操作:1、二叉搜索树的查找2、二叉搜索的插入1、树为空,直接插入2、树不为空①按照二叉搜索树的性质查找插入的位置(要标记当前访问的节点的双亲,否则找到了插入位置,却无法访问节点的双亲结点)...

2022-07-02 20:20:36 315

原创 【网络】网络基础&&套接字编程详解

目录网络初识1、网络协议初识2、网络协议的分层:OSI分层模型--->网络理论模型:TCP/IOP五层模型--->工业中采用的网络模型为什么要有网络分层?3、网络数据的封装与复用4、IP地址和MAC的地址 IP地址 MAC地址套接字编程 1、预备知识1、认识端口--->port2、网络数据的五元组信息 3、网络字节序4、主机字节序与网络字节序的互相转化 5、TCP协议与UDP协议的特性和区别 2、UDP_socket编程1、流程2、接口:3、代码实现(注意其中的一些细节问题) 3、TCP_socket编程

2022-06-26 17:09:13 1282

原创 【Linux】线程池、单例模式、乐观锁与悲观锁

线程池:什么是线程池:一种线程使用模式。线程过多会带来调度开销,进而影响缓存局部性和整体性能。而线程池维护着多个线程,等待监督管理者分配可并发执行的任务。这避免了在处理短时间任务时创建与销毁线程的代价。线程池不仅能够保证内核的充分利用,还能防止过分调度。可用线程数量应该取决于可用的并发处理器、处理内核、内存、网络sockets等的数量。应用场景:需要大量的线程来完成任务,且完成任务的时间比较短。web服务器完成网页请求这样的任务,使用线程池技术非常合适。因为单个任务小,而任务数量巨..

2022-05-21 13:14:50 313

原创 【Linux】生产者与消费者模型、信号量、死锁

死锁死锁的产生场景1、线程加锁之后,没有释放互斥锁就退出了因此,要在线程所有可能退出的地方都释放互斥锁。2、两种线程分别拿着一把锁,还想要请求对方的锁死锁的gdb分析产生了死锁,要分析其产生的原因,可以通过gdb来调试该程序,进而判断思索地原因。下面以上述情况2进行调试。1、通过调试可执行程序来分析1、b + 行号 打断点2、使用thread apply all bt命令将所有线程的调用堆栈展现出来3、使用p + 互斥锁变量可以查看...

2022-05-18 16:07:25 1108

原创 【C++】容器适配器:stack和queue

stackstack的介绍stack是一种容器适配器,专门用在具有后进先出的上下文环境中,其删除只能从容器的一端进行元素的插入与提取操作。 stack是作为容器适配器被实现的,容器适配器既是对特定类封装作为其底层的容器,并提供一组特定的成员函数来访问其元素,将特定类作为其底层的,元素特定容器的尾部(即栈顶)被压入和弹出。 stack底层容器可以是任何标准的容器类模板或者一些其他特 定的容器类,这些容器类应该支持以下操作:empty、back、push_back、pop_back 标准容器ve

2022-05-18 15:04:04 270

原创 【C++】继承看这一篇就够了

概念及定义概念:1、继承机制是面向对象程序设计使代码可以复用的最重要的手段。2、允许程序员在保持原有类特性的基础上进行扩展,增加功能。这样实现的类称为派生类/子类。基于实现该类的原有类称为基类/父类3、继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。4、继承是类层次设计的复用定义:定义方式:class 派生类:继承方式 继承类继承方式可以是public、protected、private三种,他们在继承基类时,所具有的特性以及表现出的结果也...

2022-05-08 20:37:36 1213

原创 【Linux】线程安全(看这一篇就够了)

线程安全概念:线程安全:多个线程并发同一段代码时,不会出现不同的结果。常见对全局变量或者静态变量进行操作,并且没有锁保护的情况下,会出现该问题。举例:有一个单核CPU,有两个线程A和B,有一个全局变量n初始值为10。两个线程都要执行n++这个代码,由于两个线程是抢占式执行的,那么可能会有以下情况出现:假设A先拿到CPU资源,将n的值也就是10读到了寄存器当中,此时由于某些原因(CPU调度),线程A被剥离CPU;此时线程A的PCB中的上下文信息保存了寄存器当中的信息,程序计数器记

2022-05-04 14:15:50 1564

原创 【C++】List容器使用详解和模拟实现

List介绍:1、list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。2、list的底层是带头结点双向循环链表结构,双向循环链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素。3、list和forwoed_list非常相似:最主要的不同在于forword链表是单链表,只能向前迭代,以让其更简单高效。4、与其他的序列式容器相比(array, vector, deque),list通常在任意位置进行插入、移除元素的效率

2022-04-26 17:29:41 1793

原创 【C++】vetor容器模拟实现(代码及注解)

#include<iostream>using namespace std;#include<string>#include<assert.h>template<class T>class myVector {public: typedef T* iterator; typedef const T* const_iterator;public: //构造和析构// //////////////////////////////////.

2022-04-20 13:13:19 691

原创 【Linux】线程概念&&线程控制

线程概念什么是线程:在程序里的一个执行路线就叫做线程(thread)。更准确的定义是:线城是“一个进程内部的控制序列”。一切进程至少有一个执行线程。线程在进程内部运行,本质是在进程地址空间运行。在Linux系统中,在CPU眼中,看到的PCB都要比传统的进程更加轻量化。透过进程虚拟地址空间,可以看到进程的大部分资源,将进程资源合理的分配给每个执行流,就形成了线程执行流。①Linux操作系统中没有线程的概念,我们所说的创建线程,本质上是在Linux操作系统中创建轻量级进程,因.

2022-04-16 20:28:05 413

原创 【C++】vector容器详解&&迭代器失效问题

vector介绍:1、vector是表示可变大小的序列容器2、就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而且它的大小会被容器自动处理。3、本质讲,vector使用动态分配数组来存储它的元素。当元素插入的时候,这个数组需要被重新分配大小为了增加存储空间。其做法是,分配一个新的数组,然后将全部元素移到这个数组。就时间而言这是一个相对代价高的任务,因为每当一个新的元素加入到

2022-04-14 10:51:27 1594

原创 【C++】string类的实现

头文件#pragma once#include<iostream>using namespace std;class myString {public: typedef char* iterator;public: //构造和析构 myString(const char* s = ""); myString(const myString& str); myString& operator=(const myString& str); ~my.

2022-04-10 22:16:13 767

原创 【C++】STL简介、sting类详解、浅拷贝问题的解决

STL简介:什么是STL:STL(standard template libaray-标准模板库):是C++标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个保罗数据结构和算法的软件框架。STL六大组件:string的使用:为什么要学习string类:c语言中,字符串是以‘\0’结尾的一些字符的集合,为了操作方便,c标准库中提供了一些str系列的库函数,但是这些库函数与字符串是分离开的,不太符合面向对象的思想,而且底层空间需要用户自己管理,稍不留神可能还会越界访问.

2022-04-10 14:42:58 798

原创 【C++】模板(函数模板,类模板,模板的特化,模板的分离编译)

目录泛型编程函数模板:概念:函数模板原理:函数模板的实例化:泛型编程如何实现一个通用的交换函数?使用函数重载可以实现,但是有以下几个不好的地方:1、重载的函数只是类型不同,代码的复用率比较低,只要有新类型出现时,就需要增加对应的函数。2、代码的可维护性比较低,一个出错可能所有的重载均出错。那能否告诉编译器一个模子,让编译器根据不同的类型利用该模子来生成代码呢:答案就是模板,分为函数模板和类模板。泛型编程:编写与类型无关的通用代码,是代码复用的一种手段.

2022-04-06 22:59:51 288

原创 【C++】类和对象(看这一篇就够了)

类的定义class className{}; //注意分号class为定义类的关键字,ClassName为类的名字,{}中为类的主体,注意类定义结束时后面的分号。类中的元素为类的成员;类中的数据成为类的属性或者成员变量;类中的函数成为类的方法或者成员函数。类的两种定义方式:1、声明和定义都放在类体中(注意:成员函数如果在类中定义,编译器可能会将其当作内联函数处理)class Person {public: void show() { cout << _n.

2022-03-31 15:32:57 1019

原创 【Linux】进程信号

信号的概念信号只是告诉我们有这样一个信号,但是具体这个信号如何处理,什么时候处理是由进程决定的,所以是软中断。种类可以通过kill -l命令来查看所有信号。注意:总共有62个信号,没有32和33号信号。其中1-31号信号被称之为非实时信号,也叫非可靠信号,它在使用的过程中信号可能会丢失。34-64号信号被称为实时信号,也叫可靠信号,它在使用过程中信号不会丢失。信号的产生硬件产生方式1、Ctrl + c产生的是2号信号SIGINT,是一个中断信号。2、Ctrl +

2022-03-30 14:30:56 1747

原创 【Linux】进程间通信(匿名管道、命名管道、共享内存、消息队列)

为什么需要进程间通信每一个进程的数据都是存储在物理内存当中,进程通过各自的进程虚拟地址空间进行访问,访问的时候通过各自的页表的映射关系,访问物理内存。从进程的角度看,每个进程都认为自己拥有4G(32位操作系统)的空间。至于物理内存当中如何存储,页表如何映射,进程是不清楚的。这也造就了进程的独立性。好处:让每个进程运行的时候都是独立运行的,数据不会乱窜。坏处:如果两个数据之间需要数据交换,由于进程的独立性,就没有那么方便了。常见的进程间通信方式:管道、共享内存、消息队列、信号量、信号、网络

2022-03-23 19:19:47 1573

原创 C++入门(在掌握了C语言的基础上)

C++关键字:C语言有32个关键字(c90),C++有63个关键字(c++98)。命名空间:定义:表示一个标识符的可见范围,使用namespace{ }的形式定义。注意:1、命名空间中的内容,即可以定义变量,也可以定义函数。2、命名空间可以嵌套使用。3、同一个工程中允许存在多个相同名称的命名空间,编译器最终会合成同一个命名空间中(所以相同名称的命名空间中不能存在相同的成员变量名称额,否则会产生冲突)4、一个命名空间就定义了一个新的作用域,命名空间中所有的内容都局限.

2022-03-14 19:55:26 1533 1

原创 【Linux】基础IO(文件接口、文件描述符、重定向、库、软硬链接)

C文件接口1、fopenpath:带有路径的文件名称,不带路径,则默认当前路径mode:打开文件的方式返回值:成功返回文件流指针FILE*,失败返回NULLmode打开方式的方式:'r':只读方式打开,将文件指针指向文件头,如果文件不存在,则返回空。'r+':读写方式打开,将文件指针指向文件头,如果文件不存在,则返回空。'w':写入方式打开,将文件指针指向文件头并将文件内容清空。如果文件不存在则创建。'w+':读写方式打开,将文件指针指向文件头并将文件内容清空.

2022-03-09 15:47:55 1145 3

原创 【Linux】进程控制

目录1、进程创建1.1、fork函数内部完成的功能1.2、用户空间&内核空间1.3、写时拷贝2、进程终止2.1、进程终止的场景2.2正常终止2.3、异常终止2.4、exit和_exit函数的区别1、执行用户自定义的清理函数2、冲刷缓冲区,关闭流等2.5、缓冲区冲刷缓冲区的方式缓冲方式3、进程等待3.1:为什么要进程等待3,2、进程等待的方法wait方法:waitpid函数:参数status的含义:1、...

2022-03-04 20:43:59 460

原创 【Linux】进程概念大全

目录1、操作系统的描述1.1、操作系统是什么?1.2、操作系统在做什么?1.3、操作系统使怎样完成这些事的?1.4、系统调用 & 库函数2、进程相关概念2.1 程序 & 进程2.2 管理进程2.3 描述(PCB)2.3.1、进程号(PID)2.3.2、进程状态:就绪/运行/阻塞(从cpu的角度理解)2.3.3、并发&并行2.3.4:细分的进程状态(重点)2.3.5、程序计数器2.3.6、上下文信息2.3.6、内存指针.

2022-03-02 15:36:23 862

原创 八大排序详解(c语言实现)

一、直接插入排序算法思想:把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列。平时我们玩扑克牌的时候就用了这个思想。实现方法:在插入第i个元素时,前面的(i-1)个元素已经有序,只需要从后往前依次比较,找到合适的插入位置并插入,原来位置上的元素顺序后移。void InsertSort(int array[], int size) { for (int i = 1; i < size; i++) { int end =

2022-01-23 20:38:28 427

原创 二叉树常见算法题(单值二叉树、二叉树的最大深度、反转二叉树、判断两颗二叉树是否相同、对称二叉树、一颗二叉树是否是另一颗二叉树的子树)

这里的代码都是递归实现的,再强调下二叉树的概念,二叉树的构成有两种情况:1、空树2、根节点 + 左子树 + 右子树(这里的左子树和右子树又是一颗二叉树)可以看出二叉树就是递归定义的,下面的算法题中大多都要用到这个思想。一、单值二叉树1、题目要求:2、解法:这个也就是遍历二叉树,然后判断它是否和根节点的值相同,前序、中序、后序遍历都可以。3、代码:bool _isUnivalTree(struct TreeNode* root,int num){ if(root.

2021-12-27 20:07:05 1554 1

原创 二叉树递归操作大全(前序、中序、后序、层序遍历、二叉树的创建、节点、叶子节点和第k层节点个数、判断是否为完全二叉树)

在完成二叉树里面的操作时得先明白二叉树的概念,二叉树有两种情况:1、空树2、根节点 + 根节点的左子树 + 根节点的右子树 (这里的左子树和右子树又是一颗二叉树)可以看出在定义二叉树的时候就是用递归的方式定义的,后面的操作大多也都用到这样的思想。一、二叉树的遍历1、前序遍历规则:访问根节点 --> 前序遍历左子树 --->前序遍历右子树...

2021-12-26 21:59:33 820

原创 堆的相关操作(创建堆、插入、删除、堆排序、top-k问题)

一、什么是堆堆得满足两个特性:1、首先得是一个完全二叉树 2、每个节点比其孩子节点都大(小),则其是大(小)堆。堆是将其元素存储在一维数组中的。二、堆的创建1、首先了解堆向下调整算法:向下调整算法有一个前提:左右子树必须得是一个堆。如图所示,只有根节点不满足堆的特性。现在就来向下调整根节点,使其整体成为一个小堆。具体做法是让父节点和它较小的子节点交换(前提是左右节点都存在),然后再让父节点等于子节点;重复此操作...

2021-12-08 19:16:07 3056

原创 栈和队列常见oj题(括号匹配问题、栈实现队列、队列实现栈、设计循环队列)

一、括号匹配问题1、题目要求:2、大体思路遍历这个字符串,如果是左括号就让它入栈,如果是右括号就让它和栈顶元素进行匹配(前提是栈中有元素),匹配成功的话就让栈顶元素出栈,匹配失败就返回false,直到遍历完字符串,如果遍历完了栈中没有元素,则返回true。3、代码实现bool isValid(char * s){ Stack stack; StackInit(&stack);//初始化 int i = 0; while(s[i] != '\0'.

2021-12-05 17:44:42 620

原创 链表相关算法题(找出两个链表相交的第一个结点,判断链表是否带环,返回链表入环的第一个结点)

一、相交链表1、题目要求2、解题方法相交的情况有三种:首先判断两个链表是否相交,判断方法为找到两个链表的最后一个结点,比较它们是否相等(注意这里比较的是地址),相等的话它们就一定相交。然后找它们相交的起始结点,方法为定义两个指针,先让两个指针移动到距离相交的起始节点相等的位置,然后让两个指针同时向后移动,直到它们相等(地址相等)。3、代码typedef struct ListNode Node;struct ListNode *getIntersectionNo.

2021-11-27 23:13:10 311

原创 复制带随机指针的链表(详细方法和代码)

一、题目要求二、解题思路1、在每个结点后插入一个和此结点值相等的新结点。然后给新结点的随机指针赋值,画图就可以看出,旧结点随机指针不指向空时,新结点的随机指针应该指向旧结点随机指针指向的结点的下一个结点。如图:2、用三个指针将链表分割,让cur指向tail,然后三个指针依次向后移动一位。注意循环停止条件。如图:三、代码typedef struct Node Node;struct Node* copyRandomList(struct Node* head...

2021-11-27 22:08:00 396

原创 单链表常见算法题详细方法和代码(删除结点、反转链表、找中间结点、找倒数第k个结点、判断链表是否为回文结构、合并两个有序链表)

一、删除节点1、题目要求2、代码实现注意:这里是用cur遍历链表的,还要创建一个指针变量prev用来记录cur前一个结点,要不然进行删除操作时找不到cur上一个结点。typedef struct ListNode ListNode;struct ListNode* removeElements(struct ListNode* head, int val){ //空链表 if(head == NULL){ return head; } .

2021-11-26 16:20:04 359

原创 leetcode题目:翻转字符串中的单词(c语言解法)

一、题目要求输入一个字符串 s ,逐个翻转字符串中的所有 单词 。单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。请你输出一个翻转 s 中单词顺序并用单个空格相连的字符串。说明:输入字符串 s 可以在前面、后面或者单词间包含多余的空格。翻转后单词间应当仅用一个空格分隔。翻转后的字符串中不应包含额外的空格。输入格式:一行 包含一个字符串输出格式:一行 包含一个翻转后的字符串示例 1:输入: "the sky is blue"

2021-11-20 17:15:57 562 1

原创 找出数组中两个只出现一次的数(c语言实现)

一、问题描述一个整型数组 nums 里除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。二、思路先取所有数字异或。假如结果的二进制为10100,因为第三位为1,我们可以得知目标数的第三位不同,然后用二进制数00100和每一个数按位与,这样就把所有的数分为两部分,且目标数不在一起,相同的数在一起。再把每一部分的数异或就可以得到结果。三、具体代码int* singleNumbers(int* nums, int n

2021-11-15 17:29:21 938

原创 在博客上如何上传源码/代码块

在这以前写博客的时候都是发的截图,今天终于意识到了这个问题,也找到了发布的方法。一、找到代码段这个图标二、然后在里面粘贴选中的代码,右上角可选择语言三、粘贴后是这个样子,我还疑惑了好久为什么不像别人那种有颜色还有序号,后来才发现只要发布成功后就会自动变成那样了。像这样typedef struct Linkman { char name[1024]; char gender[1024]; char age[1024]; char number...

2021-11-09 18:44:09 1153

原创 c语言实现通讯录管理系统(附源码和详细注解)

今天学完了c语言,这是我编写的通讯录管理系统,亲测有效,没有问题:基本功能有:1、添加联系人2、查找一个联系人3、修改联系人4、删除一个联系人5、展示所有联系人6、清空所有联系人7、以名字排序所有联系人此外,此程序还支持动态扩容和文件操作(保存和读取功能),注意文件位置,得先创建。#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<stdlib.h>#include<

2021-11-09 18:05:51 12595 17

原创 (c语言)模拟实现atoi函数

一、用法将字符串中的数字字符转换成整型数。注意:会跳过字符串前面的空白字符,直到遇上正负号或者数字才开始转化,结束的标志为遇到非数字或者字符串结束(也就是'\0')。二、代码实现...

2021-11-07 18:17:19 107

原创 c语言中结构体内存对齐规则(详解)

一、为什么存在内存对齐1、平台原因:不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。2、性能原因:数据结构(尤其是栈)应该尽可能地在自然边界上对齐。原因在于,为了访问未对齐的内存,处理器需要做两次内存访问;而对齐的内存访问仅需要一次访问。二、对齐规则1、第一个成员在与结构体偏移量为0的地址处。2、其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处对齐数 = 编译器默认的对齐数与该成员大小的较小值。(vs

2021-11-02 15:08:05 2996 1

原创 (c语言)模拟实现字符串函数:strlen、strcpy、strcat、strcmp、strstr、memcpy、memmove(具体方法和代码)

一、strlen(求字符串长度)此代码比较简单,注意assert的使用,它的头文件是#include<assert.h>也可以使用递归方法二、srcpy(字符串的拷贝)注意:字符串末尾的'\0'也会被拷贝三、strcat(字符串拼接)注意:拷贝完后要添上' \0',函数的返回值为dest四、strcmp(字符串的比较)比较规则为按字典序比较五、strstr(判断一个字符串是否包含另一个字符串)注意这里创建了三个指针变量,black指...

2021-11-01 16:45:36 447

原创 判断电脑是大端字节序还是小端字节序(详细方法和代码)

1、什么是大端小端大端(存储)模式,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址 中; 小端(存储)模式,是指数据的低位保存在内存的低地址中,而数据的高位,,保存在内存的高地 址中。2、具体判断方法给定一个int类型的数字num值为1如果是大端字节序,则在内存中存储方式为 0000 0000 0000 0000 0000 0000 0000 0001如果是小端字节序,则在内存中存储方式为0000 00...

2021-10-27 17:04:46 2588 5

原创 c语言实现打印100000以内的水仙花数(具体步骤和代码)

一、问题描述求出0~100000之间的所有“水仙花数”并输出。“水仙花数”是指一个n位数,其各位数字的n次方之和确好等于该数本身,如:153=1 ^ 3+5 ^ 3+3 ^ 3,则153是一个“水仙花数”。二、解决方法遍历0到100000之间的数,先得到它们的位数n,然后求出每一位数的n次方的和,再和它本身相比。三、代码实现运行结果...

2021-10-18 18:45:36 949

空空如也

空空如也

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

TA关注的人

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