数据结构顺序表实现通讯录

目录

1. 前言:

2.通讯录项目的创建

3. 通讯录的实现

3.1 通讯录的初始化

3.2 通讯录的销毁

3.3 通讯录添加数据

3.4 通讯录查找数据

3.5 通讯录展示数据 

 3.6 通讯录删除数据

 3.7 通讯录修改数据

 4. 通讯录完整代码

4.1 test.c

4.2 SeqList.h

4.3 SeqList.c

 4.4 Contact.h

4.5 Contact.c


1. 前言:

想必大家也都用过手机上面的通讯录吧,手机上面的通讯录有着许多的功能,可以新建联系人,删除联系人,查找联系人,修改联系人等等一系列的功能,我们其实也可以使用数据结构中的顺序表来模拟实现一下这样功能。

本章主要讲述利用顺序表来实现一个简单的通讯录项目

2.通讯录项目的创建

通讯录项目在以顺序表的结构上面会多增加两个文件

通讯录头文件Contact.h和通讯录源文件Contact.h

我们之前使用顺序表数据是用的整型,但是我们想要实现一个通讯录,那么单单一个整型的数据肯定是不能完成的,通讯录里面的数据要有联系人姓名,联系人性别,联系人年龄,联系人电话,联系人住址,一想到需要这么多数据,我们不免就会用到结构体了。

Contact.h 创建结构体

//这里我们用#define来定义大小,方便后续修改
#define NAME_MAX  20
#define GENDER_MAX   20
#define TEL_MAX 20
#define ADDR_MAX 100typedef struct SeqList son;//这里我们把顺序表重新命名为son//创建一个存放联系人数据的结构体
typedef struct personinfo
{char name[NAME_MAX];//姓名char gender[GENDER_MAX];//性别int age;//年龄char tel[TEL_MAX];//电话char addr[ADDR_MAX];//住址
}person;

我们在SeqList.h里面包含通讯录头文件,并把int类型修改为struct类型

这里我们的test.c里面也包含通讯录头文件

 这里我们把int类型修改成struct类型之后,在SeqList.c里面我们的查找方法和打印方法就会报错,这时我们只需要注释掉这两个方法就好了。

最后在Contact.c里面包含通讯录头文件和顺序表头文件

3. 通讯录的实现

3.1 通讯录的初始化

思路:

我们在之前写顺序表的时候,写过初始化的方法,我们可以直接调用这个方法为我们的通讯录进行初始化

Contact.c

void ConInit(son* con)
{assert(con);//判断con是否为空指针//这里我们在顺序表里面就写过初始化的方法,我们直接调用,这个就是初始化方法的复用SLInit(con);
}

通讯录初始化的测试

3.2 通讯录的销毁

思路:

我们写顺序表时也写过销毁方法,我们这里直接调用方法就可以了

 Contact.c

void ConDestroy(son* con)
{assert(con);//判断con是否为空指针SLDestroy(con);//顺序表销毁方法复用
}

通讯录的销毁测试

3.3 通讯录添加数据

思路:

在我们对通讯录添加数据之前,我们需要检查一下空间大小是否足够,不够申请空间,调用我们之前顺序表的空间检查,增容函数,然后,我们创建一个结构体,把我们想要添加的联系人数据都写上,最后我们在写顺序表时有三种插入方法,我们这里选择尾插,调用尾插方法,将创建的结构体变量传过去,这样通讯录添加数据就完成了

Contact.h

void ConAdd(son* con)
{assert(con);//判断con是否为空指针//在我们添加联系人数据之前,我们需要检查空间大小SLCheckCapacity(con);//这里我们创建一个结构体变量person p;//我们在这里将我们添加联系人的数据写入到p结构体里面//这里姓名,性别,电话,住址都是数组,数组名是首元素的地址,所以不需要取地址符号printf("请输入你要添加联系人的姓名\n");scanf("%s", p.name);printf("请输入你要添加联系人的性别\n");scanf("%s", p.gender);printf("请输入你要添加联系人的年龄\n");scanf("%d", &(p.age));//age是整型,需要取地址printf("请输入你要添加联系人的电话\n");scanf("%s", p.tel);printf("请输入你要添加联系人的住址\n");scanf("%s", p.addr);//在这里我们写了3中插入数据的方法,随便调用一种即可,我们选择尾插printf("联系人新建成功!\n");SLPushBack(con, p);//我们将p结构体尾插进去
}

通讯录添加数据测试

3.4 通讯录查找数据

思路:

我们一般想要在通讯录里面查找联系人一般直接就是查找联系人的姓名,这里我们也是这样思考的,我们直接创建一个字符数组来接收要查找的联系人姓名,然后再通讯录里面利用循环的方法进行查找,然后找到联系人了,我们就把它的数据都打印出来,这样通讯录查找数据就完成了。

Contact.c

int Confind(son* con,char name[])
{int i = 0;//循环查找for (i = 0; i < con->size; i++){if (strcmp(con->arr[i].name,name) == 0){return i;}}return -1;
}
void ConFind(son* con)
{assert(con);//判断con是否为空指针//在这里我们创建一个字符数组用来接收输入要查找的联系人姓名char name[NAME_MAX];printf("请输入你要查找的联系人姓名\n");scanf("%s",name);//写一个查找函数,在通讯录里面循环查找int find =Confind(con,name);//查找到了返回下标,如果没有查找到返回不是下标的数if (find < 0){printf("你要查找的联系人不存在!\n");}else{   //当我们查找到了,就把它打印出来printf("姓名 性别 年龄 电话 住址\n");printf("%4s %4s %4d %4s %4s\n",con->arr[find].name,con->arr[find].gender,con->arr[find].age,con->arr[find].tel,con->arr[find].addr);}
}

 通讯录查找数据测试:

3.5 通讯录展示数据 

思路:

我们直接利用循环来打印通讯里里面的所有联系人数据

Contact.c

void ConShow(son* con)
{assert(con);//判断con是否为空指针printf("姓名 性别 年龄 电话 住址\n");int i = 0;for (i = 0; i < con->size; i++){printf("%4s %4s %4d %4s %4s\n",con->arr[i].name,con->arr[i].gender,con->arr[i].age,con->arr[i].tel,con->arr[i].addr);}
}

通讯录展示数据测试

 3.6 通讯录删除数据

思路:

这个删除数据,首先我们肯定要考虑到通过联系人姓名进行删除联系人数据,我们要先创建一个字符数据来接收我们要删除的联系人姓名,然后利用前面写过的查找函数,来判断联系人是否在通讯录里面,最后,我们利用在前面顺序表里面写过的指定位置删除的方法进行删除,这样通讯录删除数据就完成了

Contact.c

void ConDel(son* con)
{assert(con);//判断con是否为空指针char name[NAME_MAX];//创建变量来接收要删除的联系人姓名printf("请输入你要删除的联系人姓名\n");scanf("%s", name);//这里先调用一下查找函数,看看联系人是否存在int find = Confind(con,name);if (find < 0){printf("你要删除的联系人不存在\n");}else{printf("联系人删除成功!\n");//这里我们在前面顺序表里面写过在指定位置删除,进行复用SLEarse(con,find);}
}

通讯录删除数据测试

 

 3.7 通讯录修改数据

思路:

这里,我们是要对在通讯录里面的联系人数据进行修改,那我们肯定先查找要修改的联系人姓名在不在通讯录里面,利用查找函数,如果存在,直接进行修改

Contact.

void ConModify(son* con)
{assert(con);//判断con是否为空指针char name[NAME_MAX];//创建变量来接收要修改的联系人姓名printf("请输入你要修改的联系人姓名\n");scanf("%s",name);//这里先调用一下查找函数,看看联系人是否存在int find = Confind(con, name);if (find < 0){printf("你要修改的联系人不存在\n");}else{   //我们直接在这里进行修改printf("请输入你要新建联系人的姓名\n");scanf("%s", con->arr[find].name);printf("请输入你要新建联系人的性别\n");scanf("%s", con->arr[find].gender);printf("请输入你要新建联系人的年龄\n");scanf("%d", &(con->arr[find].age));//age是整型,需要取地址printf("请输入你要新建联系人的电话\n");scanf("%s", con->arr[find].tel);printf("请输入你要新建联系人的住址\n");scanf("%s", con->arr[find].addr);}printf("联系人修改成功!\n");
}

通讯录修改数据测试

 

 4. 通讯录完整代码

4.1 test.c

#include"SeqList.h"//包含顺序表头文件
#include"Contact.h"//包含通讯录头文件void menu()
{printf("----------通讯录----------\n");printf("-------1.新建联系人-------\n");printf("-------2.删除联系人-------\n");printf("-------3.展示联系人-------\n");printf("-------4.查找联系人-------\n");printf("-------5.修改联系人-------\n");printf("-------0.退出通讯录-------\n");}
int main()
{int input = 0;son con;ConInit(&con);do{menu();printf("请选择你的操作!\n");scanf("%d", &input);switch (input){case 1:ConAdd(&con);break;case 2:ConDel(&con);break;case 3:ConShow(&con);break;case 4:ConFind(&con);break;case 5:ConModify(&con);break;default:printf("选择错误,请重新选择!\n");break;}} while (input);return 0;
}

4.2 SeqList.h

#include"Contact.h"//下面是需要使用到的库函数的头文件
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<string.h>//typedef int SLData;//类型重命名,为了方便后续替换类型
//我们把int类型替换成strcut 类型
typedef person SLData;typedef struct SeqList //类型重命名
{SLData *arr;//定长数组int size;//顺序表当前有效的数据个数int capacity;//容量大小
}sl;//顺序表增容
void SLCheckCapacity(sl* ps);
//顺序表初始化
void SLInit(sl* ps);
//顺序表打印
void SLPaint(sl* ps);
//顺序表尾插
void SLPushBack(sl* ps, SLData x);
//顺序表头插
void SLPushFront(sl* ps, SLData x);
//顺序表尾删
void SLPopBack(sl* ps);
//顺序表头删
void SLPopFront(sl* ps);
//顺序表指定位置之前插入
void SLInsert(sl* ps, int pos, SLData x);
//顺序表指定位置删除
void SLEarse(sl* ps, int pos);
//顺序表修改指定位置数据
void SLModify(sl* ps,int pos, SLData x);
//顺序表数据查找
int SLFind(sl* ps, SLData x);
//顺序表销毁
void SLDestroy(sl* ps);

4.3 SeqList.c

#include"SeqList.h"//包含顺序表的头文件void SLInit(sl* ps)
{assert(ps);//判断ps是否为空指针//这里我们不知道这个顺序表需求的大小ps->arr = NULL;//我们就先把指针置为空ps->size = ps->capacity = 0;//这里有效数据个数和可存储数据个数都置为0;
}void SLDestroy(sl* ps)
{assert(ps);//判断ps是否为空指针free(ps->arr);//释放动态内存开辟的空间ps->arr = NULL;//防止ps->arr变成野指针ps->size = ps->capacity = 0;//将有效数据和空间大小置0
}void SLCheckCapacity(sl* ps)
{assert(ps);//判断ps是否为空指针if (ps->size == ps->capacity)//判断有效数据个数和可存储数据个数,这里如果有效数据个数==可存储数据个数,说明空间不够了,需要增容{//这里利用三目操作符,判断可用数据个数的大小,并创建相同变量来接收int tmp = ps->capacity == 0 ? 4 : 2 * ps->capacity;//这里我们用于同类型指针来接收realloc开辟空间返回的地址SLData* ptr = (SLData*)realloc(ps->arr, tmp * sizeof(SLData));//判断是否开辟成功if (ptr == NULL){//开辟失败,报错perror("realloc");exit(1);//退出程序}//开辟成功,接收ps->arr = ptr;ps->capacity = tmp;//接收可用空间数据}
}void SLPushBack(sl* ps, SLData x)
{assert(ps);//断言ps是否为空指针//检查空间大小,不够进行增容SLCheckCapacity(ps);//这里我们在size位置进行尾插,之后让size++(后置++,先使用在++),用来记录顺序表中有效数据的个数ps->arr[ps->size++] = x;
}//void SLPaint(sl* ps)
//{
//	assert(ps);//判断ps是否为空指针
//	int i = 0;
//	//循环打印
//	for (i = 0; i < ps->size; i++)
//	{
//		printf("%d ", ps->arr[i]);
//	}
//	//换行
//	printf("\n");
//}void SLPushFront(sl* ps, SLData x)
{assert(ps);//判断ps是否为空指针//判断空间大小SLCheckCapacity(ps);int i = 0;//循环移动数据for (i = ps->size; i > 0; i--){ps->arr[i] = ps->arr[i - 1];//将前面的数据复制到后一位}//这里i == 0,跳出循环ps->arr[i] = x;//让顺序表有效数据个数++ps->size++;
}void SLPopBack(sl* ps)
{assert(ps);//判断ps是否为空指针assert(ps->size);//判断顺序表里面的有效数据个数ps->size--;
}void SLPopFront(sl* ps)
{assert(ps);//判断ps是否为空指针assert(ps->size);//判断顺序表里面的有效数据个数int i = 0;//循环移动for (i = 0; i < ps->size; i++){ps->arr[i] = ps->arr[i + 1];//将后面值赋值给前一位}ps->size--;
}void SLInsert(sl* ps, int pos, SLData x)
{assert(ps);//判断ps是否为空指针assert(pos >= 0 && pos < ps->size);//判断删除数据的范围SLCheckCapacity(ps);//判断空间大小int i = 0;for (i = ps->size; i > pos; i--){ps->arr[i] = ps->arr[i - 1];//将数据整体往后移动一位}//i == pos 跳出循环ps->arr[i] = x;ps->size++;
}void SLEarse(sl* ps, int pos)
{assert(ps);//判断ps是否为空指针assert(pos >= 0 && pos < ps->size);//判断指定位置的范围int i = 0;for (i = pos; i < ps->size; i++){ps->arr[i] = ps->arr[i + 1];//将指定位置之后的数据整体往前移动一位}ps->size--;
}void SLModify(sl* ps, int pos, SLData x)
{assert(ps);//判断ps是否为空指针assert(pos >= 0 && pos < ps->size);//判断指定位置是否合法ps->arr[pos] = x;
}

 4.4 Contact.h

//这里我们用#define来定义大小,方便后续修改
#define NAME_MAX  20
#define GENDER_MAX   20
#define TEL_MAX 20
#define ADDR_MAX 100typedef struct SeqList son;//这里我们把顺序表重新命名为son//创建一个存放联系人数据的结构体
typedef struct personinfo
{char name[NAME_MAX];//姓名char gender[GENDER_MAX];//性别int age;//年龄char tel[TEL_MAX];//电话char addr[ADDR_MAX];//住址
}person;//通讯录初始化
void ConInit(son* con);
//通讯录销毁
void ConDestroy(son* con);
//通讯录添加数据
void ConAdd(son* con);
//通讯录查找数据
void ConFind(son* con);
//通讯录展示数据
void ConShow(son* con);
//通讯录删除数据
void ConDel(son* con);
//通讯录修改数据
void ConModify(son* con);

4.5 Contact.c

#include"Contact.h"
#include"SeqList.h"void ConInit(son* con)
{assert(con);//判断con是否为空指针//这里我们在顺序表里面就写过初始化的方法,我们直接调用,这个就是初始化方法的复用SLInit(con);
}void ConDestroy(son* con)
{assert(con);//判断con是否为空指针SLDestroy(con);//顺序表销毁方法复用
}void ConAdd(son* con)
{assert(con);//判断con是否为空指针//在我们添加联系人数据之前,我们需要检查空间大小SLCheckCapacity(con);//这里我们创建一个结构体变量person p;//我们在这里将我们添加联系人的数据写入到p结构体里面//这里姓名,性别,电话,住址都是数组,数组名是首元素的地址,所以不需要取地址符号printf("请输入你要添加联系人的姓名\n");scanf("%s", p.name);printf("请输入你要添加联系人的性别\n");scanf("%s", p.gender);printf("请输入你要添加联系人的年龄\n");scanf("%d", &(p.age));//age是整型,需要取地址printf("请输入你要添加联系人的电话\n");scanf("%s", p.tel);printf("请输入你要添加联系人的住址\n");scanf("%s", p.addr);printf("联系人新建成功!\n");printf("--------------------------\n");//在这里我们写了3中插入数据的方法,随便调用一种即可,我们选择尾插SLPushBack(con, p);//我们将p结构体尾插进去
}int Confind(son* con,char name[])
{int i = 0;//循环查找for (i = 0; i < con->size; i++){if (strcmp(con->arr[i].name,name) == 0){return i;}}return -1;
}
void ConFind(son* con)
{assert(con);//判断con是否为空指针//在这里我们创建一个字符数组用来接收输入要查找的联系人姓名char name[NAME_MAX];printf("请输入你要查找的联系人姓名\n");scanf("%s",name);//写一个查找函数,在通讯录里面循环查找int find =Confind(con,name);//查找到了返回下标,如果没有查找到返回不是下标的数if (find < 0){printf("你要查找的联系人不存在!\n");return;//提前返回}else{   //当我们查找到了,就把它打印出来printf("姓名 性别 年龄 电话 住址\n");printf("%4s %4s %4d %4s %4s\n",con->arr[find].name,con->arr[find].gender,con->arr[find].age,con->arr[find].tel,con->arr[find].addr);}
}void ConShow(son* con)
{assert(con);//判断con是否为空指针printf("姓名 性别 年龄 电话 住址\n");int i = 0;for (i = 0; i < con->size; i++){printf("%4s %4s %4d %4s %4s\n",con->arr[i].name,con->arr[i].gender,con->arr[i].age,con->arr[i].tel,con->arr[i].addr);}
}void ConDel(son* con)
{assert(con);//判断con是否为空指针char name[NAME_MAX];//创建变量来接收要删除的联系人姓名printf("请输入你要删除的联系人姓名\n");scanf("%s", name);//这里先调用一下查找函数,看看联系人是否存在int find = Confind(con,name);if (find < 0){printf("你要删除的联系人不存在\n");return;//提前返回}else{//这里我们在前面顺序表里面写过在指定位置删除,进行复用printf("联系人删除成功!\n");SLEarse(con,find);}
}void ConModify(son* con)
{assert(con);//判断con是否为空指针char name[NAME_MAX];//创建变量来接收要修改的联系人姓名printf("请输入你要修改的联系人姓名\n");scanf("%s",name);//这里先调用一下查找函数,看看联系人是否存在int find = Confind(con, name);if (find < 0){printf("你要修改的联系人不存在\n");}else{   //我们直接在这里进行修改printf("请输入你要新建联系人的姓名\n");scanf("%s", con->arr[find].name);printf("请输入你要新建联系人的性别\n");scanf("%s", con->arr[find].gender);printf("请输入你要新建联系人的年龄\n");scanf("%d", &(con->arr[find].age));//age是整型,需要取地址printf("请输入你要新建联系人的电话\n");scanf("%s", con->arr[find].tel);printf("请输入你要新建联系人的住址\n");scanf("%s", con->arr[find].addr);}printf("联系人修改成功!\n");
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据结构(Java实现):ArrayList

目录 1.ArrayList简介2.ArrayList构造方法分析3.ArrayList的add方法以及扩容机制4.ArrayList常用方法5.ArrayList遍历6.ArrayList的缺陷 1.ArrayList简介 在集合框架中&#xff0c;ArrayList是一个普通的类&#xff0c;实现了List接口&#xff0c;具体框架图如下&#xff1a; …

编写一个llvm编译器插件,完成在store汇编指令前对内存合法性的check。

dds(iceoryx、fastdds等)中间件采用了共享内存&#xff0c;如果app内存越界将共享内存踩踏坏了&#xff0c;将会形成灾难。本插件可以检测到app是否在写共享内存&#xff0c;如果是&#xff0c;我们可以让app assert。从而提高dds的稳定性 插件效果&#xff1a; 插件源码&…

话题:如何让大模型变得更聪明?

随着人工智能&#xff08;AI&#xff09;技术的迅速发展&#xff0c;大模型&#xff08;如GPT-4、BERT、Transformer等&#xff09;在自然语言处理、图像识别和语音识别等领域取得了显著成果。然而&#xff0c;如何让大模型变得更聪明&#xff0c;进一步提升其性能和应用效果&a…

Jetbrain | IDEA的启动logo替换成可爱的vtuber-logo

看了这个&#xff0c;好可爱 【上Github热榜了&#xff01;当编程语言的Logo变得可爱起来~】 又看了这个 光速整活&#xff0c;强啊 看到很多人整IDEA的logo包括我自己&#xff0c;都不是特别方便的搞&#xff0c;我就直接把文件放在绑定资源里直接下吧 然后直接找到本体的安…

【深度学习】与【PyTorch实战】

目录 一、深度学习基础 1.1 神经网络简介 1.2 激活函数 1.3 损失函数 1.4 优化算法 二、PyTorch基础 2.1 PyTorch简介 2.2 张量操作 2.3 构建神经网络 2.4训练模型 2.5 模型评估 三、PyTorch实战 3.1 数据加载与预处理 3.2 模型定义与训练 3.3 模型评估与调优 3…

成都青年AI人才崭露头角,知了汇智科技助力孵化营大放异彩

5月18日-19日&#xff0c;为期两天的成都国际商贸城青年&#xff08;大学生&#xff09;AI应用孵化营活动在热烈的氛围中圆满落幕。本次活动由成都国际商贸城、成都成商数字科技有限公司、成都知了汇智科技有限公司及成都电商职教集团联合举办&#xff0c;旨在为青年&#xff0…

丢失api-ms-win-crt-runtime-l1-1-0.dll的多种解决方法分析,教你简单的一键修复

在使用Windows操作系统时&#xff0c;用户可能会遇到一个涉及丢失 ​api-ms-win-crt-runtime-l1-1-0.dll文件的警告&#xff0c;这可能导致某些程序无法正常运行。该DLL文件属于Microsoft Visual C Redistributable软件包的一部分&#xff0c;这个软件包为多个应用提供运行时支…

深度学习-Softmax回归+损失函数+图像分类数据集

目录 Softmax回归回归 VS 分类Kaggle上的分类问题 从回归到多类分类回归分类从回归到多类分类-均方损失从回归到多类分类-无校验比例从回归到多类分类-校验比例 Softmax和交叉熵损失总结损失函数均方损失绝对值损失函数鲁棒损失 图像分类数据集通过框架中内置函数将FashionMNIS…

RabbitMQ---交换机-Fanout-Direct

Publisher&#xff1a;生产者&#xff0c;不再发送消息到队列中&#xff0c;而是发给交换机Exchange&#xff1a;交换机&#xff0c;一方面&#xff0c;接收生产者发送的消息。另一方面&#xff0c;知道如何处理消息&#xff0c;例如递交给某个特别队列、递交给所有队列、或是将…

如何一键生成多个文本二维码?excel表格批量生码的方法

现在很多人会将文本信息做成二维码来展示&#xff0c;当有同类型内容生成大量二维码时&#xff0c;可以使用将文本导入excel表格的方式&#xff0c;将表格中的每条数据批量生成二维码&#xff0c;可以有效提升二维码制作的速度和效率。下面就让小编来将具体的操作步骤分享给大家…

二叉树顺序结构及链式结构

一.二叉树的顺序结构 1.定义&#xff1a;使用数组存储数据&#xff0c;一般使用数组只适合表示完全二叉树&#xff0c;此时不会有空间的浪费 注&#xff1a;二叉树的顺序存储在逻辑上是一颗二叉树&#xff0c;但是在物理上是一个数组&#xff0c;此时需要程序员自己想清楚调整…

手动安装maven依赖到本地仓库

使用mvn install命令安装jar包到指定的仓库。 命令如下&#xff1a; mvn install:install-file -Dmaven.repo.localC:\Users\liyong.m2\repository -DgroupIdcom.aspose -DartifactIdwords -Dversion18.4 -Dpackagingjar -DfileC:\Users\liyong\Desktop\jar\words-18.4.jar 解释…

grafana + Prometheus + node-exporter + pushgateway + alertmanager的监控解决方案

业内比较著名的监控解决方案&#xff0c;据笔者所知&#xff0c;大概是三套&#xff1a; 一个是zabbix的解决方案&#xff0c;一个是prometheusgrafana&#xff0c;一个是ELK zabbix比较重&#xff0c;而且原生支持监控SNMP&#xff0c;自带一个仪表盘&#xff0c;不需要额外…

docker redis 持久化

1、拉取redis镜像 docker pull redis:latest 2、 mkdir /data/redis 3、填充redis.conf文件及根据需求修改相应的配置 •通过官网地址找到对应版本的配置文件 •将配置信息复制到redis.conf中 •常见的修改配置 https://redis.io/docs/latest/operate/oss_and_stack/managem…

高仿果汁导航模板

参考原文&#xff1a;果汁导航风格模板_1234FCOM专注游戏工具及源码例子分享 极速云

基于springboot的毕业设计系统的开发源码

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的毕业设计系统的开发。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 毕业设计系统能够实现…

学习通高分免费刷课实操教程

文章目录 概要整体架构流程详细步骤云上全平台登录步骤小结 概要 我之前提到过一个通过浏览器的三个脚本就可以免费高分刷课的文章&#xff0c;由于不方便拍视频进行实操演示&#xff0c;然后写下了这个实操教程&#xff0c;之前的三个脚本划到文章末尾 整体架构流程 整体大…

窗口函数 | rows between …… and ……

ROWS BETWEEN ... AND ... 是 SQL 窗口函数中的一个子句&#xff0c;用于定义窗口函数操作的行范围。窗口函数允许用户对一组相关的记录执行计算&#xff0c;这些记录被称为窗口。 基本语法 <窗口函数> OVER ( [PARTITION BY <列名>] ORDER BY <列名> [AS…

华为云之Zabbix监控平台部署实践

华为云之Zabbix监控平台部署实践 一、本次实践介绍1.1 实践环境简介1.3 本次实践完成目标 二、 相关服务介绍2.1 华为云ECS云服务器介绍2.2 Zabbix介绍 三、环境准备工作3.1 预置实验环境3.2 查看预置环境信息 四、登录华为云4.1 登录华为云4.2 查看ECS状态4.3 连接ECS弹性云服…

力扣HOT100 - 287. 寻找重复数

解题思路&#xff1a; 快慢指针 第一步&#xff0c;慢指针每次移动一步&#xff0c;快指针每次移动两步&#xff0c;直到它们相遇。这一步保证了它们在环中相遇。 接下来&#xff0c;将其中一个指针&#xff08;快指针或慢指针&#xff09;重置到起点&#xff08;即数组的第一…