前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >顺序表详解及其c语言代码实现

顺序表详解及其c语言代码实现

作者头像
木杉乀
发布于 2021-04-01 18:25:17
发布于 2021-04-01 18:25:17
2.2K00
代码可运行
举报
文章被收录于专栏:木杉の小屋木杉の小屋
运行总次数:0
代码可运行

本人在写该文章过程中发现一个内容及其清晰地文章自己也很受益并把它推荐给你们:

详解: http://data.biancheng.net/view/157.html

因此本文章主要注重代码的实现并解析,以代码为基础进行顺序表的讲解.(注释写的挺详细的)

顺序表详解及其实现

一 什么是顺序表

线性表 (linear list): 线性表是最基本,最简单,也是最常用的一种数据结构

线性表中数据元素之间的关系是一对一的关系, 即除了第一个和最后一个数据元素之外, 其它数据元素都是首尾相

接的 (绝大部分线性表满足,有特例)

线性表,基于数据在实际物理空间中的存储状态,又可细分为顺序表(顺序存储结构)和链表(链式存 储结构)

顺序表: 在计算机内存中以数组的形式保存的线性表

二 顺序表的代码实现(注释详细)

1. 顺序表的初始化

多文件编写- Table.h (用于函数定义) , Table.c (写入函数内容与Table.h联合使用) , main.c (主程序)

文件名Table.h

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//结构体 Table:表类型
typedef struct {
	int* head;  // 1 指针 存储申请的内存首地址
	int length; // 2 长度 记录当前顺序表元素个数
	int size;   // 3 大小 记录当前的顺序表最大长度
}Table;

// 创建一个顺序表
// 参数: 初始长度
Table CreatTable(int SIZE);

// 给所有元素初始值
// 参数: 表指针 (表以创建完成,只需向表中存储内容)
Table* SetTable(Table* ptable);

文件名:Table.c (尝试多文件编写)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 创建一个(int型数据)顺序表
// 参数:初始长度
Table CreatTable(int SIZE) {
	Table table;

	//创建一个空的顺序表,动态申请内存(存储空间)
	table.head = (int*)malloc(sizeof(int) * SIZE); // malloc用于申请动态内存,详情见往期文章:指针(三)动态内存
	//判断:  malloc()函数如果申请失败返回NULL(0)
	if (!table.head) // table.head==NULL 与 !table.head 判断等价
	{
		printf("动态内存申请失败!!\n");
		exit(0); //结束程序代码
	}
	//当动态内存申请成功时:
	table.length = 0;   // 长度初始化为 0(开始顺序表内未存储元素_因此初始化长度为0)
	table.size = SIZE;  // 大小初始化为 SIZE (size为内存大小)

	return table;
}

// 给所有元素初始值
// 参数: 表指针 (表以创建完成,只需向表中存储内容)
Table* SetTable(Table* ptable) {
	printf("向表内输入%d个整数:", ptable->size);
	// size_t类型产生:typedef unsigned int size_t;(非负整型变量)
	// "->" :指针取结构体子数据
	for (size_t i = 0; i < ptable->size; i++) // 遍历整个表
	{
		scanf("%d",&ptable->head[i]);   // 赋值并通过i增加不断偏移头指针
		ptable->length++;               // 每添加一个元素,顺序表长度增加一
	}
	return ptable;
}

// 输出所有元素值
// 参数: 表/表指针(此处用表作为参数_防止改变实参的值)
void displayTable(Table table) {
	printf("顺序表中存储的元素是:\n");
	for (size_t i = 0; i < table.length; i++)
	{
		printf("%d ", table.head[i]);
	}
	printf("\ntable.size = %d , table.length = %d ;\n\n", table.size, table.length);
}

文件名:main.c

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include
#include"Table.h"

int main() {
	// 创建顺序表
	Table t;
	t = CreatTable(5);
	// 给初始值
	SetTable(&t);
	// 输出顺序表
	displayTable(t);

	return 0;
} 
2.顺序表的基本操作

这里只给出Table.c的代码实现,具体内容见完整代码

增(插入元素)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 插入一个元素
// 参数:表指针,插入值,插入位置下标 
Table* addNum(Table* ptable, int num, int pos) {
	// 判断参数是否可以执行(插入位置超出范围)
	// 插入范围: pos(0 --- ptable->length)
	if (pos < 0 || pos >ptable->length) {
		printf("参数错误! 表中无法找到插入位置\n");
		return ptable;
	}
	// 能够插入
	// 判断是否有存储空间_如果存储空间不足则扩容
	if (ptable->length >= ptable->size) {
		printf("表指针内存不足! 开始扩容....\n");
		// 扩容:(动态内存扩容具体内容见往期文章_指针(三)动态内存)
		// 1. 记录原来的内存
		int* pTemp = ptable->head; // 只有head涉及内存,无需Table*只需使用int*即可

		// 2. 申请新的内存
		ptable->head = (int*)calloc(sizeof(int), ptable->size *= 2); // 以2倍方式扩容并更改size值
		// 判断扩容是否成功(内容与Table.c_16行代码类似)
		if (!ptable->head) {
			printf("动态内存申请失败! 未成功扩容_未添加元素");
			// 未成功扩容则把原来的内存恢复(不能丢弃)
			ptable->head = pTemp;
			return ptable;
		}
		// 3. 拷贝新的内存
		for (size_t i = 0; i < ptable->length; i++)
		{
			ptable->head[i] = pTemp[i];
		}
		// 4. 释放原来的内存
		free(pTemp);
		// 5. 置空
		pTemp = NULL;   //防止变成野指针
	}
	// 插入:
	// 1.后移(先移动后面的元素)
	for (int i = ptable->length; i >= pos; i--)
	{
		ptable->head[i + 1] = ptable->head[i];
	}
	// 2.插入
	ptable->head[pos] = num;
	// 3.更改长度
	ptable->length++;
	return ptable;
}
删(删除元素)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 删除元素 (按照下标删除 返回指针)
// 参数: 表指针,下标
Table* delNum(Table* ptable, int pos) {
	// 判断参数是否可以执行(删除位置超出范围)
	if (pos >= ptable->length || pos < 0) {
		printf("参数错误! 表中无法找到删除位置\n");
		return ptable;
	}
	// 删除
	for (int i = pos; i < ptable->length; i++)
	{
		ptable->head[i] = ptable->head[i + 1];
	}
	// 改变长度
	ptable->length--;
	// 判断是否缩减大小
	if (ptable->length <= ptable->size / 2 && ptable->size % 2 == 0) {
		// 满足缩减条件
		printf("以满足内存缩减条件,正在重新分配内存...\n");
		// 缩减内存:
		// 1. 记录原来内存
		int* ptemp = ptable->head;
		// 2. 申请新的内存
		ptable->head = calloc(sizeof(int), ptable->size /= 2);
		// 判断缩减是否成功
		if (!ptable->head) {
			printf("动态内存申请失败! 未成功缩减");
			// 未成功缩减则把原来的内存恢复(不能丢弃)
			ptable->head = ptemp;
			return ptable;
		}
		// 3. 拷贝新的内存
		for (size_t i = 0; i < ptable->length; i++)
		{
			ptable->head[i] = ptemp[i];
		}
		// 4. 释放原来的内存
		free(ptemp);
		// 5. 置空
		ptemp = NULL;
	}
	
	return ptable;
}
改(更改元素)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 更改元素 按照下标更改元素 返回指针
// 参数: 表指针 下标 值
Table* changeNum(Table* ptable, int pos, int num) {
	// 判断参数是否可以执行(更改位置超出范围)
	if (pos > ptable->length - 1 || pos < 0) {
		printf("参数错误! 表中无法找到修改位置_修改失败\n");
		return ptable;
	}
	ptable->head[pos] = num;
	return ptable;
}
查(查找元素)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 查找元素 按数值查找(只返回找到的第一个) 返回下标
// 参数: 表,数值
int findWithNum(Table table, int num) {
	for (int i = 0; i < table.length; i++)
	{
		if (num == table.head[i]) {
			return i;
		}
	}
	return -1; // 找不到返回-1 程序员查找代码规范!!(找不到返回-1)
}
完整代码-输出效果

效果:(对照主程序main.c查看)

main.c

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include
#include"Table.h"

int main() {
	// 创建顺序表
	Table t;
	t = CreatTable(5);
	// 给初始值
	SetTable(&t);
	// 输出顺序表
	displayTable(t);
	// 插入值;
	addNum(&t, 13, 3); //在顺序表t中的下标为3的位置插入数值13;
	// 输出顺序表
	displayTable(t);
	// 按位置删除值并输出(链式操作_两个函数写在一起_作用:装逼)   在顺序表t中的下标为3的位置删除数值;
	displayTable(*delNum(&t, 3));
	// 查找 (测试方法,如果找到数值4_找到则删除并输出)
	displayTable(*delNum(&t, findWithNum(t, 4)));   //又是一个装逼的代码
	// 修改
	displayTable(*changeNum(&t, 3, 1314)); //把顺序表t中下标为3的数值更改为1314后输出;

	return 0;
} 

Table.h

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#define _CRT_SECURE_NO_WARNINGS 1   // 解决VS2019 scanf不安全报错问题

#ifndef _TABLE_
#define _TABLE_

/* 一.定义顺序表 */
//结构体 Table:表类型
typedef struct {
	int* head;  // 1 指针 存储申请的内存首地址
	int length; // 2 长度 记录当前顺序表元素个数
	int size;   // 3 大小 记录当前的顺序表最大长度
}Table;

/* 函数声明 */

// 创建一个顺序表
// 参数: 初始长度
Table CreatTable(int SIZE);

// 给所有元素初始值
// 参数: 表指针 (表以创建完成,只需向表中存储内容)
Table* SetTable(Table* ptable);

// 插入一个元素
// 参数: 表指针,插入值,插入位置坐标 
Table* addNum(Table* ptable, int num, int pos);

// 输出所有元素值
// 参数: 表/表指针(此处用表作为参数_防止改变实参的值)
void displayTable(Table table);

// 删除元素 (按照下标删除 返回指针)
// 参数: 表指针,下标
Table* delNum(Table* ptable, int pos);

// 查找元素 按数值查找(只返回找到的第一个) 返回下标
// 参数: 表,数值
int findWithNum(Table table, int num);

// 更改元素 按照下标更改元素 返回指针
// 参数: 表指针 下标 值
Table* changeNum(Table* ptable, int pos, int num);

#endif

Table.c

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include"Table.h"
#include
#include

#define _CRT_SECURE_NO_WARNINGS 1   // 解决VS2019 scanf不安全报错问题

// /* 函数定义 */

// 创建一个(int型数据)顺序表
// 参数:初始长度
Table CreatTable(int SIZE) {
	Table table;

	//创建一个空的顺序表,动态申请内存(存储空间)
	table.head = (int*)malloc(sizeof(int) * SIZE); // malloc用于申请动态内存,详情见往期文章:指针(三)动态内存
	//判断:  malloc()函数如果申请失败返回NULL(0)
	if (!table.head) // table.head==NULL 与 !table.head 判断等价
	{
		printf("动态内存申请失败!!\n");
		exit(0); //结束程序代码
	}
	//当动态内存申请成功时:
	table.length = 0;   // 长度初始化为 0(开始顺序表内未存储元素_因此初始化长度为0)
	table.size = SIZE;  // 大小初始化为 SIZE (size为内存大小)

	return table;
}

// 给所有元素初始值
// 参数: 表指针 (表以创建完成,只需向表中存储内容)
Table* SetTable(Table* ptable) {
	printf("向表内输入%d个整数:", ptable->size);
	// size_t类型产生:typedef unsigned int size_t;(非负整型变量)
	// "->" :指针取结构体子数据
	for (size_t i = 0; i < ptable->size; i++) // 遍历整个表
	{
		scanf("%d",&ptable->head[i]);   // 赋值并通过i增加不断偏移头指针
		ptable->length++;               // 每添加一个元素,顺序表长度增加一
	}
	return ptable;
}

// 插入一个元素
// 参数:表指针,插入值,插入位置下标 
Table* addNum(Table* ptable, int num, int pos) {
	// 判断参数是否可以执行(插入位置超出范围)
	// 插入范围: pos(0 --- ptable->length)
	if (pos < 0 || pos >ptable->length) {
		printf("参数错误! 表中无法找到插入位置\n");
		return ptable;
	}
	// 能够插入
	// 判断是否有存储空间_如果存储空间不足则扩容
	if (ptable->length >= ptable->size) {
		printf("表指针内存不足! 开始扩容....\n");
		// 扩容:(动态内存扩容具体内容见往期文章_指针(三)动态内存)
		// 1. 记录原来的内存
		int* pTemp = ptable->head; // 只有head涉及内存,无需Table*只需使用int*即可

		// 2. 申请新的内存
		ptable->head = (int*)calloc(sizeof(int), ptable->size *= 2); // 以2倍方式扩容并更改size值
		// 判断扩容是否成功(内容与Table.c_16行代码类似)
		if (!ptable->head) {
			printf("动态内存申请失败! 未成功扩容_未添加元素");
			// 未成功扩容则把原来的内存恢复(不能丢弃)
			ptable->head = pTemp;
			return ptable;
		}
		// 3. 拷贝新的内存
		for (size_t i = 0; i < ptable->length; i++)
		{
			ptable->head[i] = pTemp[i];
		}
		// 4. 释放原来的内存
		free(pTemp);
		// 5. 置空
		pTemp = NULL;   //防止变成野指针
	}
	// 插入:
	// 1.后移(先移动后面的元素)
	for (int i = ptable->length; i >= pos; i--)
	{
		ptable->head[i + 1] = ptable->head[i];
	}
	// 2.插入
	ptable->head[pos] = num;
	// 3.更改长度
	ptable->length++;
	return ptable;
}

// 输出所有元素值
// 参数: 表/表指针(此处用表作为参数_防止改变实参的值)
void displayTable(Table table) {
	printf("顺序表中存储的元素是:\n");
	for (size_t i = 0; i < table.length; i++)
	{
		printf("%d ", table.head[i]);
	}
	printf("\ntable.size = %d , table.length = %d ;\n\n", table.size, table.length);
}

// 删除元素 (按照下标删除 返回指针)
// 参数: 表指针,下标
Table* delNum(Table* ptable, int pos) {
	// 判断参数是否可以执行(删除位置超出范围)
	if (pos >= ptable->length || pos < 0) {
		printf("参数错误! 表中无法找到删除位置\n");
		return ptable;
	}
	// 删除
	for (int i = pos; i < ptable->length; i++)
	{
		ptable->head[i] = ptable->head[i + 1];
	}
	// 改变长度
	ptable->length--;
	// 判断是否缩减大小
	if (ptable->length <= ptable->size / 2 && ptable->size % 2 == 0) {
		// 满足缩减条件
		printf("以满足内存缩减条件,正在重新分配内存...\n");
		// 缩减内存:
		// 1. 记录原来内存
		int* ptemp = ptable->head;
		// 2. 申请新的内存
		ptable->head = calloc(sizeof(int), ptable->size /= 2);
		// 判断缩减是否成功
		if (!ptable->head) {
			printf("动态内存申请失败! 未成功缩减");
			// 未成功缩减则把原来的内存恢复(不能丢弃)
			ptable->head = ptemp;
			return ptable;
		}
		// 3. 拷贝新的内存
		for (size_t i = 0; i < ptable->length; i++)
		{
			ptable->head[i] = ptemp[i];
		}
		// 4. 释放原来的内存
		free(ptemp);
		// 5. 置空
		ptemp = NULL;
	}
	
	return ptable;
}

// 查找元素 按数值查找(只返回找到的第一个) 返回下标
// 参数: 表,数值
int findWithNum(Table table, int num) {
	for (int i = 0; i < table.length; i++)
	{
		if (num == table.head[i]) {
			return i;
		}
	}
	return -1; // 找不到返回-1 程序员查找代码规范!!
}

// 更改元素 按照下标更改元素 返回指针
// 参数: 表指针 下标 值
Table* changeNum(Table* ptable, int pos, int num) {
	// 判断参数是否可以执行(更改位置超出范围)
	if (pos > ptable->length - 1 || pos < 0) {
		printf("参数错误! 表中无法找到修改位置_修改失败\n");
		return ptable;
	}
	ptable->head[pos] = num;
	return ptable;
}
	
	return ptable;
}

// 查找元素 按数值查找(只返回找到的第一个) 返回下标
// 参数: 表,数值
int findWithNum(Table table, int num) {
	for (int i = 0; i < table.length; i++)
	{
		if (num == table.head[i]) {
			return i;
		}
	}
	return -1; // 找不到返回-1 程序员查找代码规范!!
}

// 更改元素 按照下标更改元素 返回指针
// 参数: 表指针 下标 值
Table* changeNum(Table* ptable, int pos, int num) {
	// 判断参数是否可以执行(更改位置超出范围)
	if (pos > ptable->length - 1 || pos < 0) {
		printf("参数错误! 表中无法找到修改位置_修改失败\n");
		return ptable;
	}
	ptable->head[pos] = num;
	return ptable;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/02/24 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
[更新]U盘快捷方式蠕虫病毒查杀脚本
经过测试,确实U盘快捷方式被打开后病毒会被复制到电脑的C盘。C:users当前用户目录AppDataRoamingMicrosoft WindowsStart MenuProgramsStartup\ C:usersAppDataRoaming 这两处。
雨落凋殇
2019/12/25
4.2K0
[更新]U盘快捷方式蠕虫病毒查杀脚本
U盘内文件变为快捷方式怎么办?【一招解决】
文章目录 前言 二、解决方法 二、处理结果 总结 ---- 前言 ❗❗❗U盘内文件变为快捷方式怎么办❓ ---- 如图,优盘中蠕虫病毒,文件变为快捷方式 二、解决方法 1️⃣新建文本文件,后缀名改为 .bat 2️⃣将下面代码,复制进去 @echo off echo ============================================ echo. echo 恢复U盘隐藏文件夹 echo. echo ======================================
MIKE笔记
2023/03/22
8791
U盘内文件变为快捷方式怎么办?【一招解决】
YouTube博主实测病毒之王“熊猫烧香”,当年是它太强还是杀毒软件太弱?
2007年,有一款电脑病毒席卷大江南北,无论是个人还是企事业单位,电脑纷纷中招,网络一度瘫痪。
大数据文摘
2021/07/06
3.5K0
incaseformate传播与复现
2021-01-13日一种名为incaseformat的蠕虫在国内爆发,该蠕虫执行后将删除被感染计算机所有非系统软件,蠕虫设定的下一次删除时间为1月23日,建议各用户做好U盘防护及查杀工作。
天钧
2021/02/03
5080
incaseformate传播与复现
U盘病毒查杀工具:USBclean Mac
USBclean是一款强大的U盘病毒查杀工具,具有检测查杀70余种U盘病毒,U盘病毒广谱扫描,U盘病毒免疫,修复显示隐藏文件及系统文件等功能!
啾咪啾咪
2022/09/28
1.3K0
如何删除U盘system volume information_u盘单独文件夹加密
情景:U盘中毒,U盘内的文件夹名称变成.exe后缀,且多出一个名为System Volume Information的文件夹,对U盘进行格式化后,所有文件消失,当拔出U盘,再次插入电脑时,发现System Volume Information文件夹再次出现。
全栈程序员站长
2022/10/02
5.2K1
u盘文件夹exe病毒彻底_u盘中病毒文件变成快捷方式怎么办
笔者在使用U盘时,无意之间发现U盘所有文件的后缀名均变为“.exe”,经过查询相关资料,确认这是一种病毒(文件夹EXE病毒)
全栈程序员站长
2022/11/17
1.1K0
u盘文件夹exe病毒彻底_u盘中病毒文件变成快捷方式怎么办
哈哈,我把熊猫烧香病毒扒了!
链接:https://bbs.pediy.com/thread-266655.htm
良月柒
2021/10/14
2.1K0
1分钟教会你:DIY一个U盘图标及U盘文件夹图标
前不久买了张M2的固态,1T容量的配了个硬盘盒,用作日常使用。顺手就把U盘的图标和一级目录的图标改了。下面,就教大家修改U盘的图标以及文件夹的图标的方法。此外,本文还会提到windows
Power
2025/03/04
2510
自己手动复现一个熊猫烧香病毒
最近逛了一下 bilibili ,偶然的一次机会,我在 bilibili 上看到了某个 up 主分享了一个他自己仿照熊猫病毒的原型制作的一个病毒的演示视频,虽然这个病毒的出现距离现在已经十多年之久了,但是它的威胁性仍然不亚于永恒之蓝,出现了很多变种病毒。我觉得蛮有意思的,有必要深究一下,所以我花上几天的时间研究了一下熊猫烧香病毒的源码,仿照熊猫烧香病毒原型,也制作了一个类似的软件,实现的源码我会在文章的末尾给出 GitHub 项目链接,喜欢的朋友不要忘记给我一个 star and follow 呀!
Angel_Kitty
2018/09/21
7.3K0
自己手动复现一个熊猫烧香病毒
计算机病毒有哪几种,计算机病毒有哪几种
计算机病毒,也叫电脑病毒。它的种类很多。一旦感染这些病毒,轻则软件无法打开或文件被加密等;重则可能会使系统崩溃导致电脑无法正常启动,而电脑之所以会中病毒,主要是以下原因:
全栈程序员站长
2022/08/18
1.9K0
Windows应急响应Day2:蠕虫病毒
蠕虫病毒是一种十分古老的计算机病毒,它是一种自包含程序(或是一套程序),通常通过网络途径传播。每入侵到一台新的计算机,它就在这台计算机上复制自己,并自己执行它的程序。
Baige
2022/03/21
1K0
【安全事件】沉睡多年的incaseformat蠕虫病毒今日被唤醒!
2021年1月13日,绿盟科技应急响应团队接到全国多个客户反馈感染所谓的incaseformat病毒,涉及政府、医疗、教育、运营商等多个行业,且感染主机多为财务管理相关应用系统。感染主机表现为所有非系统分区文件均被删除,由于被删除文件分区根目录下均存在名为incaseformat.log的空文件,因此网络上将此病毒命名为incaseformat。
绿盟科技安全情报
2021/01/18
1.2K0
fun.xls.exe病毒分析、查杀及批处理清除「建议收藏」
大家经常用U盘, 也许就和我一样,遇到过这种叫 fun.xls.exe的病毒. fun.xle.exe是一种叫做U盘病毒tel.xls.exe的变种,会在电脑里注入文件,这个病毒目前应该有四个变种.用记事本打开AUTORUN是如下代码: [AutoRun] open=fun.xls.exe shellexecute=fun.xls.exe shell\Auto\command=fun.xls.exe shell=Auto [VVflagRun] aabb=kdkfjdkfk1 这个病毒瑞星暂不能查杀,我试了下用最新的卡巴可以杀掉,网上有人用国产的江民杀好象也能杀掉,笔者没有测试。
全栈程序员站长
2022/11/09
7980
让U盘永不中毒的解决办法
  在学校上课的时候,有个老师很潇洒的拿着一个U盘就来教室上课了。然后快上课的时候在电脑上准备播放课件。注意,这一瞬间其妙的事情发生了,课件因为他的U盘中病毒了,打不开了,老师当时笑了。后来又去拷贝一份,回来还是不行,就是不知道怎么回事,我记得以前只要把我的U盘插到学校教室里的电脑上,一定中毒,就知道学校电脑年久失修,病毒太疯狂了。老师当时一点招都没有,后来我默默的贡献出了我的已经被我“动过手脚”的U盘,拷贝回来再使用,一点问题没有,哈哈!当时别提多牛气,他们以为我的U盘比较贵比较好。其实:偷偷告诉你是因为我动手脚的原因,今天我来把这个经验分享给大家~
阿豪聊干货
2018/08/09
1.5K0
让U盘永不中毒的解决办法
文件夹exe病毒专杀器
仓库地址:WhitemuTeam/Folder-exe-virus-killer: 文件夹exe专杀器(针对某高中的拉跨系统制作) (github.com)
Moemu
2023/05/04
1.7K0
推荐阅读
相关推荐
[更新]U盘快捷方式蠕虫病毒查杀脚本
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档