手撕顺序表

> 作者简介:დ旧言~,目前大一,现在学习Java,c,c++,Python等
> 座右铭:松树千年终是朽,槿花一日自为荣。
> 望小伙伴们点赞👍收藏✨加关注哟💕💕       

 🌟前言       

        梦回数组,当我们开辟了一个数组,数组的大小就已经确定了,不能括容,也不能减容,为了解决这个问题,在数据结构有一个这样的知识--《顺序表》。顺序表连续开辟一个空间,能括容,也能减容,今天我们手撕顺序表。

🌙主体

咱们从三个方面实现顺序表,动态管理,头插头删尾插尾删,增删查改。

在程序中为了实现顺序表,需要创建头文件SeqList.h ,创建源文件test.c,SeqList.c。

 🌠动态管理

💤初始化动态顺序表

  1. 首先定义一个结构体(在源文件中),结构体里面有可变数组(a),数组初始长度(size),初始空间(capacity)。
  2. 初始化动态顺序表(SeqList.h中),需要开辟空间,再判断空间是否为空,再初始化数组长度,空间。
//动态顺序表
typedef int SLDataType;
typedef struct SeqList
{
	 //定义一个可变数组
	SLDataType* a;
	 //定义数组初始长度
	 int size;
	 //定义空间大小
	 int capacity;
}SL;


//初始化动态顺序表
void SLInit(SL* ps)
{
	//开辟空间
	ps->a = (SLDataType*)malloc(sizeof(SLDataType*) * 4);
	//判断空间是否为空
	if (ps->a == NULL)
	{
		perror("malloc failed");
		exit(-1);
	}
	//初始化
	ps->size = 0;
	ps->capacity = 4;
}

1.防止一直创建结构体,为了一劳永逸,我们把动态顺序表放在源文件中。

2.这里我们用typedef int SLDataType,给数据类型重定义名字,这样就可以防止修改数据类型。

💤扩容顺序表空间

数组初始长度(size),初始空间(capacity)相同时,这里们就需要扩容,这里我们扩容两倍。(在头文件中SeqList.h中)

//扩容空间
void SLCheckCapacity(SL* ps)
{
	//如果size和capacity相同
	if (ps->size == ps->capacity)
	{
		//扩大两倍
		SLDataType* tmp = (SLDataType*)realloc(ps->a, ps->capacity * 2 * sizeof(SLDataType));
		//判断tmp是否为空
		if (tmp == NULL)
		{
			perror("realloc failed");
			exit(-1);
		}
		//赋值
		ps->a = tmp;
		ps->capacity = ps->capacity * 2;
	}
}

💤释放顺序表内存

可变数组(a)置为(NULL),数组长度(size)置为(0),初始空间(capacity)置为(0)。

//释放内存
void SLDestroy(SL* ps)
{
	//断言
	assert(ps);
	free(ps->a);
	ps->a = NULL;
	ps->size = 0;
	ps->capacity = 0;
}

 🌠头插头删尾插尾删

💤添加元素

首先需要断言防止顺序表为空。这里需要注意空间是否满了。这里的实现和在pos位置插入x有类似,等我们实现这个函数,就可以直接调用这个函数,更加简便。(在头文件中SeqList.h中)

//添加元素
void SLPushBack(SL* ps, SLDataType x)
{
	//断言
	assert(ps);
	//判断空间是否满了,需要调用函数
	SLCheckCapacity(ps);
	//添加元素
	ps->a[ps->size] = x;
	ps->size++;

	//在pos位置插入x
	//SLInsert(ps, ps->size, x);
}

💤打印元素

打印元素太简单啦,直接用for循环就行。(在头文件中SeqList.h中)

//打印数组
void SLPrint(SL* ps) 
{
	for (int i = 0; i < ps->size; i++)
	{
		printf("%d ", ps->a[i]);
	}
	printf("\n");
}

💤尾删

直接在末尾删除就行,之后这里只要size减减就好了,后面的元素会覆盖。这里的实现和在pos位置插入x有类似,等我们实现这个函数,就可以直接调用这个函数,更加简便。(在头文件中SeqList.h中)

//尾删
void SLPopBack(SL* ps)
{
	//断言
	assert(ps);
	// 温柔的检查
	//if (ps->size == 0)
		//return;

	// 暴力的检查
	assert(ps->size > 0);

	//ps->a[ps->size - 1] = 0;
	
	//这里只要size减减就好了,后面的元素会覆盖
	ps->size--;

	//删除pos位置的值
	//SLErase(ps, ps->size - 1);
}

💤头插(重点)

这里需要注意要让ps->size加加这里的实现和在pos位置插入x有类似,等我们实现这个函数,就可以直接调用这个函数,更加简便。(在头文件中SeqList.h中)

//头插
void SLPushFront(SL* ps, SLDataType x)
{
	//断言
	assert(ps);

	//定义最后一个元素
	int end = ps->size - 1;
	//循环
	while (end >= 0)
	{
		ps->a[end + 1] = ps->a[end];
		end--;
	}
	//x赋给最前的数字
	ps->a[0] = x;
	//指向下一个数字
	ps->size++;

	//在pos位置插入x
	//SLInsert(ps, 0, x);
}

💤头删(重点)

这里需要注意要让ps->size减减这里的实现和删除pos位置的值相似,等我们实现这个函数,就可以直接调用这个函数,更加简便。(在头文件中SeqList.h中)

//头删
void SLPopFront(SL* ps)
{
	//断言
	assert(ps);

	//断言(指向不能为零)
	assert(ps);
	//指向头前面的那个数字
	int begin = 1;
	//循环
	while (begin < ps->size)
	{
		ps->a[begin - 1] = ps->a[begin];
		begin++;
	}
	ps->size--;

	//删除pos位置的值
	//SLErase(ps, 0);
}

  🌠增删查改

💤在pos位置插入x

首先这里需要判断pos是否在数组空间内,其次判断空间是否充足,然后循环,最后ps->size++

这里的插入本质和头插相似。(元素向后移动一格)

//在pos位置插入x
void SLInsert(SL* ps, int pos, SLDataType x)
{
	//断言,这里pos
	assert(ps);
	assert(pos >= 0 && pos < ps->size);
	//内存不够需要括容
	SLCheckCapacity(ps);
	int end = ps->size - 1;
	while (end >= pos)
	{
		ps->a[end + 1] = ps->a[end];
		end--;
	}
	ps->a[pos] = x;
	ps->size++;
}

💤删除pos位置的值

首先这里需要判断pos是否在数组空间内,其次判断空间是否充足,然后循环,最后ps->size--

这里的删除本质和头删相似。(元素向前移动一格)

//删除pos位置的值
void SLErase(SL* ps, int pos)
{
	//断言
	assert(ps);
	//断言pos
	assert(pos >= 0 && pos < ps->size);
	int begin = pos + 1;
	while (begin < ps->size)
	{
		ps->a[begin - 1] = ps->a[begin];
		++begin;
	}
	ps->size--;
}

 💤修改pos位置的信息

这个实现太简单啦。

//修改pos位置的信息
void SLModify(SL* ps, int pos, SLDataType x)
{
	//断言
	assert(ps);
	//判断pos
	assert(pos >= 0 && pos < ps->size);
	//直接换
	ps->a[pos] = x;
}

🌠主函数

int main()
{
    //定义结构体
	SL sl;
	//初始动态列表
	SLInit(&sl);
	//释放内存
	SLDestroy(&sl);
    return 0;
}

🌙代码总结

🌠主函数

//主函数(包含头文件)
#include"SeqList.h"

//尾删
void TestSeqList1()
{
	//定义结构体
	SL sl;
	//初始化
	SLInit(&sl);
	//添加元素
	SLPushBack(&sl, 1);
	SLPushBack(&sl, 2);
	SLPushBack(&sl, 3);
	SLPushBack(&sl, 4);
	SLPushBack(&sl, 5);
	SLPushBack(&sl, 6);
	SLPushBack(&sl, 6);
	SLPushBack(&sl, 0);
	SLPushBack(&sl, 0);
	//打印元素
	SLPrint(&sl);
	//尾删
	SLPopBack(&sl);
	SLPopBack(&sl);
	//打印元素
	SLPrint(&sl);
	//尾删
	SLPopBack(&sl);
	SLPopBack(&sl);
	SLPopBack(&sl);
	SLPopBack(&sl);
	SLPopBack(&sl);
	SLPopBack(&sl);
	SLPopBack(&sl);
	//打印元素
	SLPrint(&sl);
	//添加元素
	SLPushBack(&sl, 1);
	SLPushBack(&sl, 2);
	//打印元素
	SLPrint(&sl);
	//释放内存
	SLDestroy(&sl);
}

//头删
void TestSeqList2()
{
	//定义结构体
	SL sl;
	//初始动态列表
	SLInit(&sl);
	//添加元素
	SLPushBack(&sl, 1);
	SLPushBack(&sl, 2);
	SLPushBack(&sl, 3);
	SLPushBack(&sl, 4);
	SLPushBack(&sl, 5);
	//打印元素
	SLPrint(&sl);
	//头插
	SLPushFront(&sl, 10);
	SLPushFront(&sl, 20);
	SLPushFront(&sl, 30);
	SLPushFront(&sl, 40);
	//头删
	SLPopFront(&sl);
	SLPopFront(&sl);
	SLPopFront(&sl);
	//打印元素
	SLPrint(&sl);
	//释放内存
	SLDestroy(&sl);
}

//在pos位置插入x
void TestSeqList3()
{
	//定义结构体
	SL sl;
	//初始动态列表
	SLInit(&sl);
	//添加元素
	SLPushBack(&sl, 1);
	SLPushBack(&sl, 2);
	SLPushBack(&sl, 3);
	SLPushBack(&sl, 4);
	SLPushBack(&sl, 5);
	//打印元素
	SLPrint(&sl);
	//在pos位置插入x
	int input = 0;
	printf("请输入插入的位置:");
	scanf("%d", &input);
	int number = 0;
	printf("请输入插入的数字:");
	scanf("%d", &number);
	SLInsert(&sl, input, number);
	//打印元素
	SLPrint(&sl);
	//释放内存
	SLDestroy(&sl);
}

//删除pos位置的值
void TestSeqList4()
{
	//定义结构体
	SL sl;
	//初始动态列表
	SLInit(&sl);
	//添加元素
	SLPushBack(&sl, 1);
	SLPushBack(&sl, 2);
	SLPushBack(&sl, 3);
	SLPushBack(&sl, 4);
	SLPushBack(&sl, 5);
	//打印元素
	SLPrint(&sl);
	//删除pos位置的值
	int input = 0;
	printf("请输入删除的位置:");
	scanf("%d", &input);
	SLErase(&sl, input);
	//打印元素
	SLPrint(&sl);
	//释放内存
	SLDestroy(&sl);
}

//删除pos位置的值
void TestSeqList5()
{
	//定义结构体
	SL sl;
	//初始动态列表
	SLInit(&sl);
	//添加元素
	SLPushBack(&sl, 1);
	SLPushBack(&sl, 2);
	SLPushBack(&sl, 3);
	SLPushBack(&sl, 4);
	SLPushBack(&sl, 5);
	//打印元素
	SLPrint(&sl);
	//修改pos位置的信息
	int input = 0;
	printf("请输入需要修改的位置:");
	scanf("%d", &input);
	int number = 0;
	printf("请输入需要修改的数字:");
	scanf("%d", &number);
	SLModify(&sl, input, number);
	//打印元素
	SLPrint(&sl);
	//释放内存
	SLDestroy(&sl);
}

int main()
{

	//TestSeqList1();
	//TestSeqList2();
	//TestSeqList3();
	//TestSeqList4();
	TestSeqList5();
	return 0;
}

🌠SeqList.h源文件

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>

//动态顺序表
typedef int SLDataType;
typedef struct SeqList
{
	 //定义一个可变数组
	SLDataType* a;
	 //定义数组初始长度
	 int size;
	 //定义空间大小
	 int capacity;
}SL;

//动态管理
//初始化动态顺序表
void SLInit(SL* ps);
//释放内存
void SLDestroy(SL* ps);
//打印数组
void SLPrint(SL* ps);
//扩容空间
void SLCheckCapacity(SL* ps);

// 头插头删 尾插尾删
void SLPushBack(SL* ps, SLDataType x);//添加元素
void SLPopBack(SL* ps);//尾删
void SLPushFront(SL* ps, SLDataType x);//头插元素
void SLPopFront(SL* ps);//头删

//返回下标,没有找打返回-1
int SLFind(SL* ps, SLDataType x);
//在pos位置插入x
void SLInsert(SL* ps, int pos, SLDataType x);
//删除pos位置的值
void SLErase(SL* ps, int pos);
//修改pos位置的信息
void SLModify(SL* ps, int pos, SLDataType x);

🌠SeqList.c头文件

#include"SeqList.h"

//初始化动态顺序表
void SLInit(SL* ps)
{
	//开辟空间
	ps->a = (SLDataType*)malloc(sizeof(SLDataType*) * 4);
	//判断空间是否为空
	if (ps->a == NULL)
	{
		perror("malloc failed");
		exit(-1);
	}
	//初始化
	ps->size = 0;
	ps->capacity = 4;
}

//释放内存
void SLDestroy(SL* ps)
{
	//断言
	assert(ps);
	free(ps->a);
	ps->a = NULL;
	ps->size = 0;
	ps->capacity = 0;
}

//打印数组
void SLPrint(SL* ps) 
{
	for (int i = 0; i < ps->size; i++)
	{
		printf("%d ", ps->a[i]);
	}
	printf("\n");
}

//扩容空间
void SLCheckCapacity(SL* ps)
{
	//如果size和capacity相同
	if (ps->size == ps->capacity)
	{
		//扩大两倍
		SLDataType* tmp = (SLDataType*)realloc(ps->a, ps->capacity * 2 * sizeof(SLDataType));
		//判断tmp是否为空
		if (tmp == NULL)
		{
			perror("realloc failed");
			exit(-1);
		}
		//赋值
		ps->a = tmp;
		ps->capacity = ps->capacity * 2;
	}
}

//添加元素
void SLPushBack(SL* ps, SLDataType x)
{
	//断言
	assert(ps);
	/*//判断空间是否满了,需要调用函数
	SLCheckCapacity(ps);
	//添加元素
	ps->a[ps->size] = x;
	ps->size++;*/

	//在pos位置插入x
	SLInsert(ps, ps->size, x);
}

//尾删
void SLPopBack(SL* ps)
{
	//断言
	assert(ps);
	/*// 温柔的检查
	//if (ps->size == 0)
		//return;

	// 暴力的检查
	assert(ps->size > 0);

	//ps->a[ps->size - 1] = 0;
	
	//这里只要size减减就好了,后面的会覆盖
	ps->size--;*/

	//删除pos位置的值
	SLErase(ps, ps->size - 1);
}

//头插
void SLPushFront(SL* ps, SLDataType x)
{
	//断言
	assert(ps);

	/*//定义最后一个元素
	int end = ps->size - 1;
	//循环
	while (end >= 0)
	{
		ps->a[end + 1] = ps->a[end];
		end--;
	}
	//x赋给最前的数字
	ps->a[0] = x;
	//指向下一个数字
	ps->size++;*/

	//在pos位置插入x
	SLInsert(ps, 0, x);
}

//头删
void SLPopFront(SL* ps)
{
	//断言
	assert(ps);

	/*//断言(指向不能为零)
	assert(ps);
	//指向头前面的那个数字
	int begin = 1;
	//循环
	while (begin < ps->size)
	{
		ps->a[begin - 1] = ps->a[begin];
		begin++;
	}
	ps->size--;*/

	//删除pos位置的值
	SLErase(ps, 0);
}

//返回下标,没有找打返回-1
int SLFind(SL* ps, SLDataType x)
{
	//断言
	assert(ps);
	//遍历
	for (int i = 0; i < ps->size; i++)
	{
		if (ps->a[i] == x)
		{
			return i;
		}
	}
	return -1;
}

//在pos位置插入x
void SLInsert(SL* ps, int pos, SLDataType x)
{
	//断言,这里pos
	assert(ps);
	assert(pos >= 0 && pos < ps->size);
	//内存不够需要括容
	SLCheckCapacity(ps);
	int end = ps->size - 1;
	while (end >= pos)
	{
		ps->a[end + 1] = ps->a[end];
		end--;
	}
	ps->a[pos] = x;
	ps->size++;
}

//删除pos位置的值
void SLErase(SL* ps, int pos)
{
	//断言
	assert(ps);
	//断言pos
	assert(pos >= 0 && pos < ps->size);
	int begin = pos + 1;
	while (begin < ps->size)
	{
		ps->a[begin - 1] = ps->a[begin];
		++begin;
	}
	ps->size--;
}

//修改pos位置的信息
void SLModify(SL* ps, int pos, SLDataType x)
{
	//断言
	assert(ps);
	//判断pos
	assert(pos >= 0 && pos < ps->size);
	//直接换
	ps->a[pos] = x;
}

🌟结束语

今天内容就到这里啦,时间过得很快,大家沉下心来好好学习,会有一定的收获的,大家多多坚持,嘻嘻,成功路上注定孤独,因为坚持的人不多。那请大家举起自己的小说手给博主一键三连,有你们的支持是我最大的动力💞💞💞,回见。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/48606.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Redis原理篇(二)

三、Redis网络模型 3.1 用户空间和内核态空间 服务器大多都采用Linux系统&#xff0c;这里我们以Linux为例来讲解: ubuntu和Centos 都是Linux的发行版&#xff0c;发行版可以看成对linux包了一层壳&#xff0c;任何Linux发行版&#xff0c;其系统内核都是Linux。我们的应用都…

解析数据可视化工具:如何选择最合适的软件

在当今信息爆炸的时代&#xff0c;数据已成为各行各业的重要资源。为了更好地理解和分析数据&#xff0c;数据可视化成为一种必不可少的工具。市面上数据可视化工具不说上千也有上百&#xff0c;什么帆软、powerbi、把阿里datav&#xff0c;腾讯云图、山海鲸可视化等等等等&…

科技云报道:是时候全员FinOps了吗?

科技云报道原创。 在论坛上&#xff0c;国外某企业的真实案例引发了热议。一开始该企业只顾技术创新&#xff0c;积极上云&#xff0c;不顾成本。 直到有一天&#xff0c;高层介入喊停&#xff1a;“这个云不能再上了&#xff0c;成本已经远大于收益了”。该企业因为成本失控…

express编写一个简单的get接口

/01编写get接口.jsconst express require(express) const app express()// 创建路由 const useRouter require(./router/user.js) // 注册路由 app.use(/api,useRouter)app.listen(8080, (req, res) > {console.log(8080监听) }) ./02编写post接口 // 注意&#xff1a;如…

【LeetCode】141.环形链表

题目 给你一个链表的头节点 head &#xff0c;判断链表中是否有环。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置&#…

百题千解计划【CSDN每日一练】计数问题(附解析+多种实现方法:Python、Java、C、C++、JavaScript、C#、go)

人要多久才能成熟!一瞬间?还是一辈子? 🎯作者主页: 追光者♂🔥 🌸个人简介: 💖[1] 计算机专业硕士研究生💖 🌟[2] 2022年度博客之星人工智能领域TOP4🌟 🏅[3] 阿里云社区特邀专家博主🏅 🏆[4] CSDN-人工智能领域优质创作者🏆 �

C++STL库中的list

文章目录 list的介绍及使用 list的常用接口 list的模拟实现 list与vector的对比 一、list的介绍及使用 1. list是可以在常数范围内在任意位置进行插入和删除的序列式容器&#xff0c;并且该容器可以前后双向迭代。 2. list的底层是双向带头循环链表结构&#xff0c;双向带头循…

Python爬虫实例之淘宝商品页面爬取(api接口)

可以使用Python中的requests和BeautifulSoup库来进行网页爬取和数据提取。以下是一个简单的示例&#xff1a; import requests from bs4 import BeautifulSoupdef get_product_data(url):# 发送GET请求&#xff0c;获取网页内容headers {User-Agent: Mozilla/5.0 (Windows NT…

深度学习算法的计算量

文章目录 一、FLOPs与FLOPS二、参数量parameters三、Latency与FPS四、结论 一、FLOPs与FLOPS 二、参数量parameters 三、Latency与FPS 四、结论

苹果开发“Apple GPT”AI科技迎来新格局

根据彭博社的马克・古尔曼&#xff08;Mark Gurman&#xff09;报道&#xff0c;苹果内部正在开发“Apple GPT”人工智能项目&#xff0c;足以媲美 OpenAI 的 ChatGPT &#xff0c;预计明年推出。就在彭博社消息发出之后&#xff0c;苹果股价上涨了2.3%&#xff0c;市值顶峰时增…

《论文阅读》具有特殊Token和轮级注意力的层级对话理解 ICLR 2023

《论文阅读》具有特殊Token和轮级注意力的层级对话理解 前言简介问题定义模型构建知识点Intra-turn ModelingInter-turn Modeling分类前言 你是否也对于理解论文存在困惑? 你是否也像我之前搜索论文解读,得到只是中文翻译的解读后感到失望? 小白如何从零读懂论文?和我一…

摄像头m2dock(MAIX-II DOCK)

官方文档地址 https://wiki.sipeed.com/soft/maixpy3/zh/index.html 一、软件准备 1 烧录镜像软件 2 镜像 当前最近版本镜像文件 3 SDFormatter 4 Maixpy IDE 二、SD卡准备 1 格式化SD卡&#xff08;用SDFormatter&#xff09; 2 烧录 3 弹出&#xff0c;插入开发板中 出现…

多租户的低代码平台,Saas开发平台:MateCloud

简介 MateCloud是一款基于Spring Cloud Alibaba的微服务架构。目前已经整合Spring Boot 2.7.0、 Spring Cloud 2021、Spring Cloud Alibaba 2021、Spring Security Oauth2、Feign、Dubbo、JetCache、RocketMQ等&#xff0c;支持多租户的低代码平台&#xff0c;Saas平台开发套件…

「乐天世界」NFT 作品集

进入「乐天世界」NFT 作品集的迷人世界&#xff0c;这里仿佛就是乐天世界探险主题公园里充满活力的礼品店。 准备好随着想象力的飞跃而沉浸其中吧&#xff0c;因为主题公园里的普通物品已经变得非凡。沉浸在游乐园美食的魔力中&#xff0c;如香脆的玉米热狗、令人垂涎的巧克力蛋…

MQ, RocketMQ, 安装

文章说明 本文主要说明RocketMQ的几种常见的安装方式。之前在工作中也用过RocketMQ&#xff0c;但是一直用的是测试环境上的&#xff0c;也没有自己动手安装过。这次专门抽了时间学习了一下。 文章目录 文章说明参考文献安装windows安装环境要求下载配置环境变量启动注意事项 …

接口自动化如何做?接口自动化测试- 正则用例参数化(实例)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 我们在做接口自动…

SpringCloud学习路线(9)——服务异步通讯RabbitMQ

一、初见MQ &#xff08;一&#xff09;什么是MQ&#xff1f; MQ&#xff08;MessageQueue&#xff09;&#xff0c;意思是消息队列&#xff0c;也就是事件驱动架构中的Broker。 &#xff08;二&#xff09;同步调用 1、概念&#xff1a; 同步调用是指&#xff0c;某一服务…

现在入行软测=49年入国军?三句话,让面试官再掏2K

还有一个月就步入金九银十&#xff0c;很多软测人吐槽因为疫情&#xff0c;公司都在裁员&#xff0c;别说跳槽涨薪&#xff0c;能保住现在的工作就不错了。 但也有那么一批人&#xff0c;凭借自己口才与实力拿到年薪近50W的offer。面试是初见1小时就要相互了解优缺点的过程&am…

JS学习之ES6

一、ES简介 Nodejs 安装&#xff1a; Babel 安装&#xff1a; let命令&#xff1a; 区别&#xff1a;以循环为例。 注意下面这种用法&#xff1a; 对象解构赋值&#xff1a; 字符串扩展&#xff1a; 字符串模板&#xff1a; 字符串方法&#xff1a; 数组扩展&#xff1a; 扩展…

mybatis_分页

目的&#xff1a; 减少数据处理量&#xff0c;提高效率 普通sql&#xff1a; 语法&#xff1a;select * from user limit startIndex,pageSize; SELECT * from user limit 3; #[0,n] mybatis_sql: 接口&#xff1a; //分页查询List<User> getUserByLimit(Map<…