当前位置: 首页 > news >正文

数据结构小项目----通讯录的实现(这里用链表实现) 超详细~~~~૮(˶ᵔ ᵕ ᵔ˶)ა

目录

Contact.h说明:

结构体与头文件的包含:  ​编辑

 函数在头文件的声明与定义:

 Contact.c中各个函数的实现:

1.检查链表中的数据是否满了,满了就扩容

 2.链表的尾插

 3.链表的删除

4.查找名字是否匹配

 5.初始化通讯录

6. 通讯录的摧毁

7.添加联系人的信息

8.删除联系人的信息 

9.修改联系人信息

 10.查找联系人

11.通讯录当前的联系人展示

ConTest.c源文件:

测试数据: 

最后完整代码展示: 

Contact.h:

Contact.c:

ConTest.c:


Contact.h说明:

概述:为了实现这个小项目,我开创了一个头文件:Contact.h .和两个源文件:Contact.c,ConTest.c,在Contact.h中进行结构体的声明,函数的声明和头文件的包含。Contact.c文件主要用于各个函数的实现,而ConTest则用于测试函数。

 

结构体与头文件的包含:  

 这里通过结构体数组来进行数据的插入与删除操作,为了后续的书写方便,将各个结构体变量的名字重新定义为其缩写形式(底层原理是顺序表

 函数在头文件的声明与定义:

void SLCheckCapacity(Contact* pocn);//用于顺序表的扩容
void SLPushBack(Contact* ps, ConDataType x);//顺序表的尾插
void SLErase(Contact* ps, int pos);//顺序表的删除
int FindByName(Contact* pocn, char name[]);//查找名字是否匹配void ContactInit(Contact* pocn);//通讯录的初始化
void ContactDestory(Contact* pocn);//通讯录的摧毁void ContactAdd(Contact* pocn);//通讯录的增加联系人
void ContactDel(Contact* pocn);//通讯录的删除联系人
void ContactModify(Contact* pocn);//通讯录的修改联系人信息
void ContactFind(Contact* pocn);//通讯录的查找
void ContactShow(Contact* pocn);//当前通讯录的信息的展示

 

 Contact.c中各个函数的实现:

1.检查链表中的数据是否满了,满了就扩容

代码详解:

//检查链表中的数据是否满了,满了就扩容
void SLCheckCapacity(Contact* pocn) {if (pocn->size == pocn->capacity) {int newCapacity = pocn->capacity == 0 ? 4 : 2 * pocn->capacity;//这里通过realloc来申请空间ConDataType* tmp = (ConDataType*)realloc(pocn->arr, newCapacity * sizeof(ConDataType));if (tmp == NULL) {perror("realloc fail!");exit(1);}//扩容成功pocn->arr = tmp;//注意要将当前的指针指向开创好的空间pocn->capacity = newCapacity;//容量也不要遗漏}
}

 由于顺序表是由数组实现的,如果定义一个静态数组,很不利于数据的存储。定义得太大浪费空间,定义得太小空间不够,这里我选择使用动态链表的形式实现这个问题,所以这里定义了一个函数SLCheckCapacity来检查链表的大小(size)是否超过其最大容量(capacity)。如果超过了,就需要进行扩容操作。没有就不需要进行任何操作。同时,为了和里这里扩容两倍。

 2.链表的尾插

代码详解:

//链表的尾插
void SLPushBack(Contact* ps, ConDataType x) {assert(ps);SLCheckCapacity(ps);ps->arr[ps->size++] = x;
}

首先判断这里的结构体指针是否为空,简单粗暴的方法:断言(assert),注意要引用头文件#include<assert.h>。接着要检查顺序表的容量是否满了,如果满了就扩容。 接着将数据插入尾部。

 3.链表的删除

代码解释:

//链表的删除
void SLErase(Contact* ps, int pos) {assert(ps);assert(pos >= 0 && pos < ps->size);//pos以后的数据往前挪动一位for (int i = pos; i < ps->size - 1; i++){ps->arr[i] = ps->arr[i + 1];//ps->arr[i-2] = ps->arr[i-1];}ps->size--;
}

4.查找名字是否匹配

代码解释:

//查找名字是否匹配
int FindByName(Contact* pocn, char name[]) {for (int i = 0; i < pocn->size; i++) {if (strcmp(pocn->arr[i].name, name) == 0) {return i;}}return -1;
}

如果有遗忘strcmp的小伙伴记得查收~

strcmp比较两个字符串的大小,一个字符一个字符比较,按ASCLL码比较
标准规定:
第一个字符串大于第二个字符串,则返回大于0的数字
第一个字符串等于第二个字符串,则返回0
第一个字符串小于第二个字符串,则返回小于0的数字 

 5.初始化通讯录

 代码解释:

//初始化通讯录
void ContactInit(Contact* pocn) {pocn->arr = NULL;pocn->capacity = pocn->size = 0;
}

6. 通讯录的摧毁

代码解释:

//通讯录的摧毁
void ContactDestory(Contact* pocn) {assert(pocn);if (pocn->arr) {free(pocn->arr);}pocn->arr = NULL;pocn->capacity = pocn->size = 0;
}

7.添加联系人的信息

代码解释:

//添加联系人的信息
void ContactAdd(Contact* pocn) {Info info;//输入各个联系人的信息printf("请输入联系人姓名:\n");scanf("%s", info.name);printf("请输入联系人年龄:\n");scanf("%d", &info.age);printf("请输入联系人性别:\n");scanf("%s", info.gender);printf("请输入联系人电话:\n");scanf("%s", info.tel);printf("请输入联系人地址:\n");scanf("%s", info.addr);//用尾插法进行数据的增添SLPushBack(pocn, info);
}

输入联系人的各个信息后将其尾插到链表后

8.删除联系人的信息 

代码解释:

//删除联系人的信息
void ContactDel(Contact* pocn) {//删除之前要先查找//找到之后可以删除找不到,就不能进行删除操作printf("请输入要删除的联系人名字:\n");char name[NAME_MAX];scanf("%s", name);//定义findIndex来判断是否存在联系人信息int findIndex = FindByName(pocn, name);if (findIndex < 0) {printf("要删除的信息不存在!\n");return;}//存在就删除SLErase(pocn, findIndex);printf("联系人删除成功!\n");
}

9.修改联系人信息

代码解释:

//修改联系人信息
void ContactModify(Contact* pocn) {//修改之前先查找//如果没有找到,就无法进行修改操作char name[NAME_MAX];printf("请输入要修改的联系人姓名:\n");scanf("%s", name);int findIndex = FindByName(pocn, name);if (findIndex < 0) {printf("要修改的联系人找不到!\n");return;}//修改后输入新的联系人的信息printf("请输入姓名:\n");scanf("%s", pocn->arr[findIndex].name);printf("请输入年龄:\n");scanf("%d", &pocn->arr[findIndex].age);printf("请输入性别:\n");scanf("%s", pocn->arr[findIndex].gender);printf("请输入电话:\n");scanf("%s", pocn->arr[findIndex].tel);printf("请输入地址:\n");scanf("%s", pocn->arr[findIndex].addr);printf("联系人修改成功!\n");
}

 10.查找联系人

代码解释:

//查找联系人
void ContactFind(Contact* pocn) {printf("请输入要查找的联系人姓名:\n");char name[NAME_MAX];scanf("%s", name);int findIndex = FindByName(pocn, name);if (findIndex < 0) {printf("找不到该联系人,联系人不存在!\n");return;}else printf("找到了,输出对应信息:\n");printf("%s %s %s %s %s\n", "姓名", "年龄", "性别", "电话", "地址");printf("%s %d %s %s %s\n",pocn->arr[findIndex].name,pocn->arr[findIndex].age,pocn->arr[findIndex].gender,pocn->arr[findIndex].tel,pocn->arr[findIndex].addr);
}

11.通讯录当前的联系人展示

代码解释:

//通讯录当前的联系人展示
void ContactShow(Contact* pocn) {printf("%s %s %s %s %s\n", "姓名", "年龄", "性别", "电话", "地址");for (int i = 0; i < pocn->size; i++) {printf("%s %d %s %s %s\n",pocn->arr[i].name,pocn->arr[i].age,pocn->arr[i].gender,pocn->arr[i].tel,pocn->arr[i].addr);}
}

ConTest.c源文件:

代码详解:

//引入头文件
#include"Contact.h"void menu()//菜单的打印
{printf("-------------------------请输入--------------------------------\n");printf("----------------1.增加联系人  2.删除联系人---------------------\n");printf("---------------3.修改联系人   4.查找联系人---------------------\n");printf("---------------5.查看通讯录   0.退出通讯录---------------------\n");printf("---------------------------------------------------------------\n");
}int main()
{int op = -1;Contact con;ContactInit(&con);do {menu();printf("请选择操作:");scanf("%d", &op);//这里按照菜单的指示来选择操作switch (op) {//各个数字对应各个的操作case 1:ContactAdd(&con);break;case 2:ContactDel(&con);break;case 3:ContactModify(&con);break;case 4:ContactFind(&con);break;case 5:ContactShow(&con);break;case 0:printf("通讯录退出中……\n");break;default :break;}} while (op != 0);ContactDestory(&con);//注意结束时要摧毁通讯录,防止内存泄漏return 0;
}

在ConTest文件中,主要是实现菜单的打印与各个函数操作的选择

测试数据: 

 

 

最后完整代码展示: 

 

Contact.h:

#include<assert.h>
#include<stdlib.h>//为了后续方便,这里将所要用到的数组的数据都重新定义
#define NAME_MAX 100
#define GENDER_MAX 10
#define TEL_MAX 12
#define ADDR_MAX 100
//联系人信息的存储(用结构体实现)
typedef struct PresonInformation
{char name[NAME_MAX];int age;char gender[GENDER_MAX];char tel[TEL_MAX];char addr[ADDR_MAX];
}Info;typedef Info ConDataType;
//对链表的声明与定义(结构体数组),用于对上述结构体信息存储
typedef struct SeqList
{ConDataType* arr;int capacity;int size;
}Contact;void SLCheckCapacity(Contact* pocn);//用于顺序表的扩容
void SLPushBack(Contact* ps, ConDataType x);//顺序表的尾插
void SLErase(Contact* ps, int pos);//顺序表的删除
int FindByName(Contact* pocn, char name[]);//查找名字是否匹配void ContactInit(Contact* pocn);//通讯录的初始化
void ContactDestory(Contact* pocn);//通讯录的摧毁void ContactAdd(Contact* pocn);//通讯录的增加联系人
void ContactDel(Contact* pocn);//通讯录的删除联系人
void ContactModify(Contact* pocn);//通讯录的修改联系人信息
void ContactFind(Contact* pocn);//通讯录的查找
void ContactShow(Contact* pocn);//当前通讯录的信息的展示

Contact.c:

#include"Contact.h"
//检查链表中的数据是否满了,满了就扩容
void SLCheckCapacity(Contact* pocn) {if (pocn->size == pocn->capacity) {int newCapacity = pocn->capacity == 0 ? 4 : 2 * pocn->capacity;//这里通过realloc来申请空间ConDataType* tmp = (ConDataType*)realloc(pocn->arr, newCapacity * sizeof(ConDataType));if (tmp == NULL) {perror("realloc fail!");exit(1);}//扩容成功pocn->arr = tmp;//注意要将当前的指针指向开创好的空间pocn->capacity = newCapacity;//容量也不要遗漏}
}
//链表的尾插
void SLPushBack(Contact* ps, ConDataType x) {assert(ps);SLCheckCapacity(ps);ps->arr[ps->size++] = x;
}
//链表的删除
void SLErase(Contact* ps, int pos) {assert(ps);assert(pos >= 0 && pos < ps->size);//pos以后的数据往前挪动一位for (int i = pos; i < ps->size - 1; i++){ps->arr[i] = ps->arr[i + 1];//ps->arr[i-2] = ps->arr[i-1];}ps->size--;
}
//查找名字是否匹配
int FindByName(Contact* pocn, char name[]) {for (int i = 0; i < pocn->size; i++) {if (strcmp(pocn->arr[i].name, name) == 0) {return i;}}return -1;
}//初始化通讯录
void ContactInit(Contact* pocn) {pocn->arr = NULL;pocn->capacity = pocn->size = 0;
}
//通讯录的摧毁
void ContactDestory(Contact* pocn) {assert(pocn);if (pocn->arr) {free(pocn->arr);}pocn->arr = NULL;pocn->capacity = pocn->size = 0;
}
//添加联系人的信息
void ContactAdd(Contact* pocn) {Info info;//输入各个联系人的信息printf("请输入联系人姓名:\n");scanf("%s", info.name);printf("请输入联系人年龄:\n");scanf("%d", &info.age);printf("请输入联系人性别:\n");scanf("%s", info.gender);printf("请输入联系人电话:\n");scanf("%s", info.tel);printf("请输入联系人地址:\n");scanf("%s", info.addr);//用尾插法进行数据的增添SLPushBack(pocn, info);
}//删除联系人的信息
void ContactDel(Contact* pocn) {//删除之前要先查找//找到之后可以删除找不到,就不能进行删除操作printf("请输入要删除的联系人名字:\n");char name[NAME_MAX];scanf("%s", name);//定义findIndex来判断是否存在联系人信息int findIndex = FindByName(pocn, name);if (findIndex < 0) {printf("要删除的信息不存在!\n");return;}//存在就删除SLErase(pocn, findIndex);printf("联系人删除成功!\n");
}
//修改联系人信息
void ContactModify(Contact* pocn) {//修改之前先查找//如果没有找到,就无法进行修改操作char name[NAME_MAX];printf("请输入要修改的联系人姓名:\n");scanf("%s", name);int findIndex = FindByName(pocn, name);if (findIndex < 0) {printf("要修改的联系人找不到!\n");return;}//修改后输入新的联系人的信息printf("请输入姓名:\n");scanf("%s", pocn->arr[findIndex].name);printf("请输入年龄:\n");scanf("%d", &pocn->arr[findIndex].age);printf("请输入性别:\n");scanf("%s", pocn->arr[findIndex].gender);printf("请输入电话:\n");scanf("%s", pocn->arr[findIndex].tel);printf("请输入地址:\n");scanf("%s", pocn->arr[findIndex].addr);printf("联系人修改成功!\n");
}
//查找联系人
void ContactFind(Contact* pocn) {printf("请输入要查找的联系人姓名:\n");char name[NAME_MAX];scanf("%s", name);int findIndex = FindByName(pocn, name);if (findIndex < 0) {printf("找不到该联系人,联系人不存在!\n");return;}else printf("找到了,输出对应信息:\n");printf("%s %s %s %s %s\n", "姓名", "年龄", "性别", "电话", "地址");printf("%s %d %s %s %s\n",pocn->arr[findIndex].name,pocn->arr[findIndex].age,pocn->arr[findIndex].gender,pocn->arr[findIndex].tel,pocn->arr[findIndex].addr);
}
//通讯录当前的联系人展示
void ContactShow(Contact* pocn) {printf("%s %s %s %s %s\n", "姓名", "年龄", "性别", "电话", "地址");for (int i = 0; i < pocn->size; i++) {printf("%s %d %s %s %s\n",pocn->arr[i].name,pocn->arr[i].age,pocn->arr[i].gender,pocn->arr[i].tel,pocn->arr[i].addr);}
}

ConTest.c:

//引入头文件
#include"Contact.h"void menu()//菜单的打印
{printf("-------------------------请输入--------------------------------\n");printf("----------------1.增加联系人  2.删除联系人---------------------\n");printf("---------------3.修改联系人   4.查找联系人---------------------\n");printf("---------------5.查看通讯录   0.退出通讯录---------------------\n");printf("---------------------------------------------------------------\n");
}int main()
{int op = -1;Contact con;ContactInit(&con);do {menu();printf("请选择操作:");scanf("%d", &op);//这里按照菜单的指示来选择操作switch (op) {//各个数字对应各个的操作case 1:ContactAdd(&con);break;case 2:ContactDel(&con);break;case 3:ContactModify(&con);break;case 4:ContactFind(&con);break;case 5:ContactShow(&con);break;case 0:printf("通讯录退出中……\n");break;default :break;}} while (op != 0);ContactDestory(&con);//注意结束时要摧毁通讯录,防止内存泄漏return 0;
}

博客到这里也是结束了,制作不易,喜欢的小伙伴可以点赞加关注支持下博主,这对我真的很重要~~

 

相关文章:

数据结构小项目----通讯录的实现(这里用链表实现) 超详细~~~~૮(˶ᵔ ᵕ ᵔ˶)ა

目录 Contact.h说明&#xff1a; 结构体与头文件的包含&#xff1a; ​编辑 函数在头文件的声明与定义&#xff1a; Contact.c中各个函数的实现&#xff1a; 1.检查链表中的数据是否满了&#xff0c;满了就扩容 2.链表的尾插 3.链表的删除 4.查找名字是否匹配 5.初始化通讯…...

Electron Apple SignIn 登录

本人写博客&#xff0c;向来主张&#xff1a;代码要完整&#xff0c;代码可运行&#xff0c;文中不留下任何疑惑。 最讨厌写博客&#xff0c;代码只留下片段&#xff0c;文中关键的东西没写清楚。之前看了那么多文章&#xff0c;就是不告诉我clientId从哪来的。 官方资料地址&…...

常用中间件漏洞

IIS6 IIS7 安装 控制面板-----打开关闭windows功能 添加角色-----添加IIS 启动之后访问localhost 复现 服务器换成IIS7 访问报错 大概就是缺少CGI模块 问题解决 添加php-cgi的路径 添加脚本映射 修改php.ini文件 将 cgi.fix_pathinfo1 然后设置一个图片 访问 在后缀加上/.…...

Windows系统使用手册

点击前往查看&#x1f517;我的博客文章目录 Windows系统使用手册 文章目录 Windows系统使用手册Windows10解决大小核调度问题Windows系统安装软件Windows系统Typora快捷键Windows系统压缩包方式安装redisWindows安装dockerWindows系统的docker设置阿里源Windows系统下使用doc…...

mp4文件可以转成mp3音频吗

现在是个非常流行刷短视频一个年代&#xff0c;刷短视似乎成了人们休闲娱乐的一种方式&#xff0c;在日常刷短视频过程中&#xff0c;肯定会有很多同学被短视频 bgm 神曲洗脑&#xff0c;比如很多被网红翻唱带火的歌曲&#xff0c;例如其中"不负人间”&#xff0c;就是其中…...

Java-IO流【登录注册小项目】

♥️作者&#xff1a;白日参商 &#x1f935;‍♂️个人主页&#xff1a;白日参商主页 ♥️坚持分析平时学习到的项目以及学习到的软件开发知识&#xff0c;和大家一起努力呀&#xff01;&#xff01;&#xff01; &#x1f388;&#x1f388;加油&#xff01; 加油&#xff01…...

数字化金融时代:探讨全球金融科技创新的最新动态

在当今数字化金融时代&#xff0c;金融科技创新如影随形&#xff0c;迅猛发展。本文将深入探讨全球范围内金融科技的最新动态&#xff0c;剖析各地新兴趋势与突破。从区块链技术的应用到人工智能在金融领域的崭露头角&#xff0c;我们将一一解读这个正在不断演变的金融科技画卷…...

LeetCode:206. 反转链表

力扣链接 算法思想&#xff1a;由于单链表是单向的&#xff0c;想要对当前元素进行操作&#xff0c;需找到前一个元素。本题利用双指针&#xff0c;初始pre指针指向NULL&#xff0c;cur指针指向head.再对局部翻转之前&#xff0c;先把下一个结点存到temp指针中。当进行完如下代…...

linux 安装nginx

介绍 官网 https://nginx.org/en/download.html 在安装nginx前首先要确认系统中安装了gcc、pcre-devel、zlib-devel、openssl-devel linux 检查是否安装过某软件包 yum -y install gcc pcre-devel zlib-devel openssl openssl-devel #下载 wget https://nginx.org/downloa…...

1.C语言——基础知识

C语言基础知识 1.第一个C语言程序2.注释3.标识符4.关键字5.数据类型6.变量7.常量8.运算符9.输入输出输入输出 1.第一个C语言程序 C语言的编程框架 #include <stdio.h> int main() {/* 我的第一个 C 程序 */printf("Hello, World! \n");return 0; }2.注释 单行…...

Redis 存在线程安全问题吗?为什么?

一个工作了 5 年的粉丝私信我。 他说自己准备了半年时间&#xff0c;想如蚂蚁金服&#xff0c;结果第一面就挂了&#xff0c;非常难过。 问题是&#xff1a; “Redis 存在线程安全问题吗&#xff1f;” 一、问题解析 关于这个问题&#xff0c;我从两个方面来回答。 第一个&a…...

无人机测绘助力实现高效、安全的城市规划

随着城市化进程的不断加快&#xff0c;城市规划显得尤为重要。而无人机测绘技术作为一种创新的工具&#xff0c;为城市规划提供了更加高效、安全的解决方案。它通过快速、精确的数据采集和分析&#xff0c;为行业提供有力的决策支持&#xff0c;助力城市规划的现代化和可持续发…...

实验七 RMAN恢复管理器

&#x1f57a;作者&#xff1a; 主页 我的专栏C语言从0到1探秘C数据结构从0到1探秘Linux &#x1f618;欢迎关注&#xff1a;&#x1f44d;点赞&#x1f64c;收藏✍️留言 &#x1f3c7;码字不易&#xff0c;你的&#x1f44d;点赞&#x1f64c;收藏❤️关注对我真的很重要&…...

未来 AI 可能给哪些产业带来哪些进步与帮助?

AI时代如何要让公司在创新领域领先吗&#xff1f;拥抱这5种创新技能&#xff0c;可以帮助你的公司应对不断变化。包括人工智能、云平台应用、数据分析、 网络安全和体验设计。这些技能可以帮助你提高业务效率、保护公司知识资产、明智决策、满足客户需求并提高销售额。 现在就加…...

Java医院信息管理系统

技术框架&#xff1a; springboot shiro layui jquery thymeleaf nginx 有需要的可以联系我。 运行环境&#xff1a; jdk8 mysql IntelliJ IDEA maven项目功能&#xff1a; 本项目是用springbootlayuishiro写的医院管理系统&#xff0c;系统的业务比较复杂&#x…...

QT+OSG/osgEarth编译之八十:ive+Qt编译(一套代码、一套框架,跨平台编译,版本:OSG-3.6.5插件库osgdb_ive)

文章目录 1、osgdb_ive介绍2、文件分析3、pro文件4、编译实践1、osgdb_ive介绍 通过osgdb_ive,OpenSceneGraph开源库能方便地读取ive格式的三维文件。 ive(Interchangeable Virtual Environment)是一种三维图形数据交换格式,主要用于虚拟现实和增强现实领域的场景数据交…...

Webpack5入门到原理3:基本配置

在开始使用 Webpack 之前&#xff0c;我们需要对 Webpack 的配置有一定的认识。 5 大核心概念 entry&#xff08;入口&#xff09; 指示 Webpack 从哪个文件开始打包 output&#xff08;输出&#xff09; 指示 Webpack 打包完的文件输出到哪里去&#xff0c;如何命名等 l…...

全开源多城市同城信息小程序源码(Laravel 框架),同城分类信息发布便民小程序系统【非DZ】

同城生活分类信息小程序&#xff0c;人才招聘、房产二手 多城市地区同城分类信息发布&#xff0c;商家入驻等功能 小程序前后端代码开源无加密&#xff0c;可进行二次开发 【源码运行要求】 1、需要已认证的微信小程序 2、已备案的域名及服务器空间 推荐使用宝塔面板LinuxPHP…...

PHP学习笔记1

//语法错误&#xff08;syntax error&#xff09;在语法分析阶段&#xff0c;源代码并未被执行&#xff0c;故不会有任何输出。 /* 【命名规则】 */ 常量名 类常量建议全大写&#xff0c;单词间用下划线分隔 // MIN_WIDTH 变量名建议用下划线方式分隔 // $var_na…...

C语言从入门到实战——文件操作

文件操作 前言一、 为什么使用文件二、 什么是文件2.1 程序文件2.2 数据文件2.3 文件名 三、 二进制文件和文本文件四、 文件的打开和关闭4.1 流和标准流4.1.1 流4.1.2 标准流 4.2 文件指针4.3 文件的打开和关闭4.4 文件的路径 五、 文件的顺序读写5.1 顺序读写函数介绍fgetcfp…...

云计算——弹性云计算器(ECS)

弹性云服务器&#xff1a;ECS 概述 云计算重构了ICT系统&#xff0c;云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台&#xff0c;包含如下主要概念。 ECS&#xff08;Elastic Cloud Server&#xff09;&#xff1a;即弹性云服务器&#xff0c;是云计算…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)

文章目录 1.什么是Redis&#xff1f;2.为什么要使用redis作为mysql的缓存&#xff1f;3.什么是缓存雪崩、缓存穿透、缓存击穿&#xff1f;3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)

目录 1.TCP的连接管理机制&#xff08;1&#xff09;三次握手①握手过程②对握手过程的理解 &#xff08;2&#xff09;四次挥手&#xff08;3&#xff09;握手和挥手的触发&#xff08;4&#xff09;状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...

【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分

一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计&#xff0c;提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合&#xff1a;各模块职责清晰&#xff0c;便于独立开发…...

第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词

Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵&#xff0c;其中每行&#xff0c;每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid&#xff0c;其中有多少个 3 3 的 “幻方” 子矩阵&am…...

基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解

JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用&#xff0c;结合SQLite数据库实现联系人管理功能&#xff0c;并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能&#xff0c;同时可以最小化到系统…...

从“安全密码”到测试体系:Gitee Test 赋能关键领域软件质量保障

关键领域软件测试的"安全密码"&#xff1a;Gitee Test如何破解行业痛点 在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的"神经中枢"。从国防军工到能源电力&#xff0c;从金融交易到交通管控&#xff0c;这些关乎国计民生的关键领域…...

嵌入式学习之系统编程(九)OSI模型、TCP/IP模型、UDP协议网络相关编程(6.3)

目录 一、网络编程--OSI模型 二、网络编程--TCP/IP模型 三、网络接口 四、UDP网络相关编程及主要函数 ​编辑​编辑 UDP的特征 socke函数 bind函数 recvfrom函数&#xff08;接收函数&#xff09; sendto函数&#xff08;发送函数&#xff09; 五、网络编程之 UDP 用…...

Axure 下拉框联动

实现选省、选完省之后选对应省份下的市区...

第八部分:阶段项目 6:构建 React 前端应用

现在&#xff0c;是时候将你学到的 React 基础知识付诸实践&#xff0c;构建一个简单的前端应用来模拟与后端 API 的交互了。在这个阶段&#xff0c;你可以先使用模拟数据&#xff0c;或者如果你的后端 API&#xff08;阶段项目 5&#xff09;已经搭建好&#xff0c;可以直接连…...