基于单链表实现通讯管理系统!(有完整源码!)

                                                                                个人主页:秋风起,再归来~

                                                                                文章专栏:C语言实战项目                              

                                                                        个人格言:悟已往之不谏,知来者犹可追

                                                                                        克心守己,律己则安!

1、前言

友友们,这篇文章是基于单链表来实现通讯管理系统的,所以一定要先看完我之前写过的一篇关于单链表的实现(文章链接)的文章哦~

其实基于单链表实现通讯录的思路与基于顺讯表实现通讯录的思路是一样的,在这里我就不进行赘述了。如果还没有看过我之前写的一篇基于顺序表实现通讯录(文章链接)的宝子们一定要去看看哦~

2、各种接口的实现

以下是我们希望实现的接口~

//contact.h
#pragma once
#define NAME_MAX 100
#define SEX_MAX 4
#define TEL_MAX 11
#define ADDR_MAX 100

//前置声明
typedef struct SListNode contact;

//用户数据
typedef struct PersonInfo
{
    char name[NAME_MAX];
    char sex[SEX_MAX];
    int age;
    char tel[TEL_MAX];
    char addr[ADDR_MAX];
}PeoInfo;

//初始化通讯录
void InitContact(contact** con);

//添加通讯录数据
void AddContact(contact** con);

//展示通讯录数据
void ShowContact(contact* con);

//删除通讯录数据
void DelContact(contact** con);

//查找通讯录数据
void FindContact(contact* con);

//修改通讯录数据
void ModifyContact(contact** con);

//销毁通讯录数据
void DestroyContact(contact** con);

2.1 初始化通讯录

我们希望在初始化通讯录时导入之前我们原有文件中的数据,那我们就可以进行如下的操作~

//从文件中导入原数据
void DLoadContact(contact** con)
{
	FILE* pf = fopen("contact.txt", "rb");
	if (pf == NULL)
	{
		perror("open fail\n");
		return;
	}
	PeoInfo p = { 0 };
	while (fread(&p, sizeof(PeoInfo),1,pf))
	{
		SListPushBack(con, p);
	}
	printf("历史数据导入成功!\n");
	fclose(pf);
	pf = NULL;
}

在初始化通讯录之后加载数据! 

//初始化通讯录
void InitContact(contact** con)
{
	assert(con);
	(*con) = NULL;
	DLoadContact(con);
}

2.2 添加通讯录数据

//添加通讯录数据
void AddContact(contact** con)
{
	assert(con);
	PeoInfo p = {0};
	printf("请输入添加联系人的姓名:");
	scanf("%s", p.name);
	printf("请输入添加联系人的性别:");
	scanf("%s", p.sex);
	printf("请输入添加联系人的年龄:");
	scanf("%d", &(p.age));
	printf("请输入添加联系人的电话:");
	scanf("%s", p.tel);
	printf("请输入添加联系人的住址:");
	scanf("%s", p.addr);
	SListPushBack(con,p);
	printf("\n");
}

2.3 删除通讯录数据

在查找通讯录数据之外封装一个函数(findByName)来通过名字查找联系人!

(因为我们在之后的查找和修改接口中都会用到这个方法,所以我们把它封装成一个函数方便我们后续的使用!)

//通过名字查找联系人
contact* findByName(contact* con,char* name)
{
	assert(con);
	contact* cur = con;
	while (cur)
	{
		if (strcmp(cur->data.name, name) == 0)
		{
			return cur;
		}
		cur = cur->next;
	}
	return NULL;
}

在原有单链表的删除指定数据的接口上进行封装(让单链表摇身一变成为通讯录!)

//删除通讯录数据
void DelContact(contact** con)
{
	assert(con && (*con));
	char name[NAME_MAX];
	printf("请输入你要删除的联系人的名字:");
	scanf("%s", name);
	contact* pos = findByName(*con,name);
	if (pos == NULL)
	{
		printf("您要删除的联系人不存在!\n");
		return;
	}
	SListErase(con, pos);
	printf("删除成功!\n");
}

2.4 展示通讯录数据

遍历我们的通讯录打印信息!

//展示通讯录数据
void ShowContact(contact* con)
{
	assert(con);
	contact* cur = con;
	printf("名字\t\t性别\t\t年龄\t\t电话\t\t住址\n");//打印表头
	while (cur)
	{
		printf("%s\t\t%s\t\t%d\t\t%s\t\t%s\n",
			cur->data.name,
			cur->data.sex,
			cur->data.age,
			cur->data.tel,
			cur->data.addr);
		cur = cur->next;
	}
}

2.5 查找通讯录数据

//通过名字查找联系人
contact* findByName(contact* con,char* name)
{
	assert(con);
	contact* cur = con;
	while (cur)
	{
		if (strcmp(cur->data.name, name) == 0)
		{
			return cur;
		}
		cur = cur->next;
	}
	return NULL;
}

在接口内部调用该函数! 

//查找通讯录数据
void FindContact(contact* con)
{
	assert(con);
	char name[NAME_MAX];
	printf("请输入你要查找的联系人的名字:");
	scanf("%s", name);
	contact* ret = findByName(con, name);
	if (ret == NULL)
	{
		printf("您要查找的联系人不存在!\n");
		return;
	}
	printf("找到了!\n");
	printf("名字\t\t性别\t\t年龄\t\t电话\t\t住址\n");//打印表头
		printf("%s\t\t%s\t\t%d\t\t%s\t\t%s\n",
			ret->data.name,
			ret->data.sex,
			ret->data.age,
			ret->data.tel,
			ret->data.addr);
}

2.6 修改通讯录数据

//通过名字查找联系人
contact* findByName(contact* con,char* name)
{
	assert(con);
	contact* cur = con;
	while (cur)
	{
		if (strcmp(cur->data.name, name) == 0)
		{
			return cur;
		}
		cur = cur->next;
	}
	return NULL;
}

在接口内部调用该函数! 

//修改通讯录数据
void ModifyContact(contact** con)
{
	assert(con);
	char name[NAME_MAX];
	printf("请输入你要修改的联系人的名字:");
	scanf("%s", name);
	contact* ret = findByName(*con, name);
	if (ret == NULL)
	{
		printf("您要修改的联系人不存在!\n");
		return;
	}
	PeoInfo p = { 0 };
	printf("请输入修改后联系人的姓名:");
	scanf("%s", p.name);
	printf("请输入修改后联系人的性别:");
	scanf("%s", p.sex);
	printf("请输入修改后加联系人的年龄:");
	scanf("%d", &(p.age));
	printf("请输入修改后联系人的电话:");
	scanf("%s", p.tel);
	printf("请输入修改后联系人的住址:");
	scanf("%s", p.addr);
	SListModify(ret, p);
	printf("修改成功!\n");
}

2.7 销毁通讯录数据

因为我们希望在退出通讯管理系统的时候可以将我们的操作都保留下来,所以我们可以对其进行文件操作!

//将输入的数据保存到文件中
void SaveContact(contact** con)
{
	FILE* pf = fopen("contact.txt", "wb");
	if (pf == NULL)
	{
		perror("open fail!\n");
		return;
	}
	contact* cur = *con;
	while (cur)
	{
		fwrite(&(cur->data), sizeof(PeoInfo), 1, pf);
		cur = cur->next;
	}
	printf("历史数据保存成功!\n");
	fclose(pf);
	pf = NULL;
}

 在销毁通讯录之前保留数据!

//销毁通讯录数据
void DestroyContact(contact** con)
{
	SaveContact(con);
	SListDestroy(con);
}

3、完整源码

SeqList.h

#pragma once//避免头文件被多次引用
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#include"Contact.h"
typedef PeoInfo SListDataType;//便于改变数据类型

//定义一个结构体类型的节点
typedef struct SListNode
{
	SListDataType data;
	struct SListNode* next;//存储下一个节点的地址
}SListNode;

//1. 新节点的创建
SListNode* SListCreatNode(SListDataType x);

//2. 打印单链表
void PrintSList(SListNode* phead);

//3. 头插
void SListPushFront(SListNode** phead, SListDataType x);

//4. 头删
void  SListPopFront(SListNode** phead);

//5. 尾差
void SListPushBack(SListNode** phead, SListDataType x);

//6. 尾删
void  SListPopBack(SListNode** phead);

//7. 查找元素X
SListNode* SListFind(SListNode* phead, SListDataType x);

//8. 在pos位置修改
void SListModify(SListNode* pos, SListDataType x);

//9. 在任意位置之前插入
void SListInsert(SListNode** phead, SListNode* pos, SListDataType x);

//10. 在任意位置删除
void SListErase(SListNode** phead, SListNode* pos);

//11. 销毁单链表
void SListDestroy(SListNode** phead);

Contact.h

#define _CRT_SECURE_NO_WARNINGS

//contact.h
#pragma once
#define NAME_MAX 100
#define SEX_MAX 4
#define TEL_MAX 11
#define ADDR_MAX 100

//前置声明
typedef struct SListNode contact;

//用户数据
typedef struct PersonInfo
{
    char name[NAME_MAX];
    char sex[SEX_MAX];
    int age;
    char tel[TEL_MAX];
    char addr[ADDR_MAX];
}PeoInfo;

//初始化通讯录
void InitContact(contact** con);

//添加通讯录数据
void AddContact(contact** con);

//展示通讯录数据
void ShowContact(contact* con);

//删除通讯录数据
void DelContact(contact** con);

//查找通讯录数据
void FindContact(contact* con);

//修改通讯录数据
void ModifyContact(contact** con);

//销毁通讯录数据
void DestroyContact(contact** con);

SeqList.c

#include"SList.h"

//1. 新节点的创建
SListNode* SListCreatNode(SListDataType x)
{
	SListNode* NewNode = (SListNode*)malloc(sizeof(SListNode));//开辟空间
	if (NewNode == NULL)//判断空间是否开辟成功
	{
		perror("malloc fail");
		return NULL;
	}
	NewNode->data = x;//赋值
	NewNode->next = NULL;//置空
	return NewNode;
}

#if 0
//2. 打印单链表
void PrintSList(SListNode* phead)
{
	if (phead == NULL)
	{
		printf("NULL");//如果链表没有元素就打印NULL
		return;
	}
	SListNode* cur = phead;
	//循环单链表打印
	while (cur != NULL)
	{
		printf("%d->", cur->data);
		cur = cur->next;
	}
	printf("NULL\n");
}
#endif

//3. 头插
void SListPushFront(SListNode** phead, SListDataType x)
{
	assert(phead);
	SListNode* newnode = SListCreatNode(x);//创建一个新节点
	newnode->next = *phead;
	*phead = newnode;
}

//4. 头删
void  SListPopFront(SListNode** phead)
{
	assert(phead);
	assert(*phead);//如果没有数据就不用头删,并报错
	SListNode* cur = (*phead)->next;
	free(*phead);
	*phead = cur;
}

//5. 尾插
void SListPushBack(SListNode** phead, SListDataType x)
{
	assert(phead);
	if (*phead == NULL)
	{
		*phead = SListCreatNode(x);//创建新节点并插入
	}
	else
	{
		SListNode* tail = *phead;
		while (tail->next != NULL)//找到尾节点
		{
			tail = tail->next;
		}
		tail->next = SListCreatNode(x);//创建新节点并插入
	}
}

//6. 尾删
void  SListPopBack(SListNode** phead)
{
	assert(phead);
	assert(*phead);//链表为空就不进行尾删
	SListNode* tail = *phead;
	if (tail->next == NULL)//如果链表就只有一个元素就进行头删
	{
		SListPopFront(phead);
	}
	else
	{
		while (tail->next->next != NULL)
		{
			tail = tail->next;
		}
		free(tail->next);
		tail->next = NULL;
	}
}

#if 0
//7. 查找元素X
SListNode* SListFind(SListNode* phead, SListDataType x)
{
	assert(phead);
	while (phead->next != NULL)//注意最后一个节点是没有查找的
	{
		if (phead->data == x)
			return phead;
		phead = phead->next;
	}
	if (phead->data == x)
		return phead;//最后一个节点没有查找
	else
		return NULL;//没找到
}
#endif

//8. 在pos位置修改
void SListModify(SListNode* pos, SListDataType x)
{
	assert(pos);
	pos->data = x;
}

//9. 在任意位置之前插入
void SListInsert(SListNode** phead, SListNode* pos, SListDataType x)
{
	assert(phead);
	assert(*phead);
	if (pos == *phead)//如果pos位置刚好是第一个节点就进行头插
	{
		SListPushFront(phead, x);
	}
	else
	{
		SListNode* newnode = SListCreatNode(x);
		SListNode* cur = *phead;
		while (cur->next != pos)//找到pos前一个节点
		{
			cur = cur->next;
		}
		cur->next = newnode;
		newnode->next = pos;
	}
}

//10. 在任意位置删除
void SListErase(SListNode** phead, SListNode* pos)
{
	assert(phead && *phead && pos);
	if (pos == *phead)//如果pos位置就是第一个节点就进行头删
	{
		SListPopFront(phead);
	}
	else
	{
		SListNode* cur = *phead;
		while (cur->next != pos)//找到pos前一个节点
		{
			cur = cur->next;
		}
		cur->next = pos->next;
		free(pos);
	}
}

//11. 销毁单链表
void SListDestroy(SListNode** phead)
{
	assert(*phead && phead);
	SListNode* cur = *phead;
	while (cur != NULL)
	{
		SListNode* tmp = cur->next;
		free(cur);
		cur = tmp;
	}
	*phead = NULL;
}

Contact.c

#include"SList.h"

//从文件中导入原数据
void DLoadContact(contact** con)
{
	FILE* pf = fopen("contact.txt", "rb");
	if (pf == NULL)
	{
		perror("open fail\n");
		return;
	}
	PeoInfo p = { 0 };
	while (fread(&p, sizeof(PeoInfo),1,pf))
	{
		SListPushBack(con, p);
	}
	printf("历史数据导入成功!\n");
	fclose(pf);
	pf = NULL;
}

//初始化通讯录
void InitContact(contact** con)
{
	assert(con);
	(*con) = NULL;
	DLoadContact(con);
}

//添加通讯录数据
void AddContact(contact** con)
{
	assert(con);
	PeoInfo p = {0};
	printf("请输入添加联系人的姓名:");
	scanf("%s", p.name);
	printf("请输入添加联系人的性别:");
	scanf("%s", p.sex);
	printf("请输入添加联系人的年龄:");
	scanf("%d", &(p.age));
	printf("请输入添加联系人的电话:");
	scanf("%s", p.tel);
	printf("请输入添加联系人的住址:");
	scanf("%s", p.addr);
	SListPushBack(con,p);
	printf("\n");
}

//展示通讯录数据
void ShowContact(contact* con)
{
	assert(con);
	contact* cur = con;
	printf("名字\t\t性别\t\t年龄\t\t电话\t\t住址\n");//打印表头
	while (cur)
	{
		printf("%s\t\t%s\t\t%d\t\t%s\t\t%s\n",
			cur->data.name,
			cur->data.sex,
			cur->data.age,
			cur->data.tel,
			cur->data.addr);
		cur = cur->next;
	}
}

//通过名字查找联系人
contact* findByName(contact* con,char* name)
{
	assert(con);
	contact* cur = con;
	while (cur)
	{
		if (strcmp(cur->data.name, name) == 0)
		{
			return cur;
		}
		cur = cur->next;
	}
	return NULL;
}

//删除通讯录数据
void DelContact(contact** con)
{
	assert(con && (*con));
	char name[NAME_MAX];
	printf("请输入你要删除的联系人的名字:");
	scanf("%s", name);
	contact* pos = findByName(*con,name);
	if (pos == NULL)
	{
		printf("您要删除的联系人不存在!\n");
		return;
	}
	SListErase(con, pos);
	printf("删除成功!\n");
}

//查找通讯录数据
void FindContact(contact* con)
{
	assert(con);
	char name[NAME_MAX];
	printf("请输入你要查找的联系人的名字:");
	scanf("%s", name);
	contact* ret = findByName(con, name);
	if (ret == NULL)
	{
		printf("您要查找的联系人不存在!\n");
		return;
	}
	printf("找到了!\n");
	printf("名字\t\t性别\t\t年龄\t\t电话\t\t住址\n");//打印表头
		printf("%s\t\t%s\t\t%d\t\t%s\t\t%s\n",
			ret->data.name,
			ret->data.sex,
			ret->data.age,
			ret->data.tel,
			ret->data.addr);
}

//修改通讯录数据
void ModifyContact(contact** con)
{
	assert(con);
	char name[NAME_MAX];
	printf("请输入你要修改的联系人的名字:");
	scanf("%s", name);
	contact* ret = findByName(*con, name);
	if (ret == NULL)
	{
		printf("您要修改的联系人不存在!\n");
		return;
	}
	PeoInfo p = { 0 };
	printf("请输入修改后联系人的姓名:");
	scanf("%s", p.name);
	printf("请输入修改后联系人的性别:");
	scanf("%s", p.sex);
	printf("请输入修改后加联系人的年龄:");
	scanf("%d", &(p.age));
	printf("请输入修改后联系人的电话:");
	scanf("%s", p.tel);
	printf("请输入修改后联系人的住址:");
	scanf("%s", p.addr);
	SListModify(ret, p);
	printf("修改成功!\n");
}

//将输入的数据保存到文件中
void SaveContact(contact** con)
{
	FILE* pf = fopen("contact.txt", "wb");
	if (pf == NULL)
	{
		perror("open fail!\n");
		return;
	}
	contact* cur = *con;
	while (cur)
	{
		fwrite(&(cur->data), sizeof(PeoInfo), 1, pf);
		cur = cur->next;
	}
	printf("历史数据保存成功!\n");
	fclose(pf);
	pf = NULL;
}
//销毁通讯录数据
void DestroyContact(contact** con)
{
	SaveContact(con);
	SListDestroy(con);
}

 这里我就没有单独去写一个菜单了,本身的意义也并不大,但是如果友友们想写一个来玩一玩,可以看看我之前那篇基于顺序表实现通讯录(文章链接,那里有菜单的模版(只要改几个接口的名字就行了)~

4、 完结散花

好了,这期的分享到这里就结束了~

如果这篇博客对你有帮助的话,可以用你们的小手指点一个免费的赞并收藏起来哟~

如果期待博主下期内容的话,可以点点关注,避免找不到我了呢~

我们下期不见不散~~

​​​​

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

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

相关文章

解决window10 utf-8编码软件中文全部乱码问题

问题描述 很多软件都是乱码状态&#xff0c;不管是Keil还是ISP或者是其他的一些非知名软件&#xff0c;都出现了中文乱码&#xff0c;英文正常显示问题&#xff0c;这个时候是系统出了问题。 解决方法 打开控制面板 点击更改日期、时间或数字格式 点击管理和更改系统区域…

华为云配置安全组策略开放端口

&#x1f436;博主主页&#xff1a;ᰔᩚ. 一怀明月ꦿ ❤️‍&#x1f525;专栏系列&#xff1a;线性代数&#xff0c;C初学者入门训练&#xff0c;题解C&#xff0c;C的使用文章&#xff0c;「初学」C &#x1f525;座右铭&#xff1a;“不要等到什么都没有了&#xff0c;才下…

mysql 查询实战-变量方式-解答

对mysql 查询实战-变量方式-题目&#xff0c;进行一个解答。&#xff08;先看题&#xff0c;先做&#xff0c;再看解答&#xff09; 1、查询表中⾄少连续三次的数字 1&#xff0c;处理思路 要计算连续出现的数字&#xff0c;加个前置变量&#xff0c;记录上一个的值&#xff0c…

类和对象(拷贝构造函数)

目录 拷贝构造函数 特征 结论&#xff1a; 拷贝构造函数 拷贝构造函数&#xff1a;只有单个形参&#xff0c;该形参是对本类类型对象的引用(一般常用const修饰)&#xff0c;在用已存 在的类类型对象创建新对象时由编译器自动调用。 特征 拷贝构造函数也是特殊的成员函数&…

SQL注入sqli_labs靶场第十一、十二、十三、十四题详解

第十一题 方法一 poss提交 输入1显示登录失败 输入1 显示报错信息 根据提示得知&#xff1a;SQL查询语句为 username参数 and password and是与运算&#xff1b;两个或多个条件同时满足&#xff0c;才为真&#xff08;显示一条数据&#xff09; or是或运算&#xff0c;两个…

itext7 pdf转图片

https://github.com/thombrink/itext7.pdfimage 新建asp.net core8项目&#xff0c;安装itext7和system.drawing.common 引入itext.pdfimage核心代码 imageListener下有一段不安全的代码 unsafe{for (int y 0; y < image.Height; y){byte* ptrMask (byte*)bitsMask.Scan…

B站大数据平台元数据业务分享

背景介绍 元数据是数据平台的衍生数据&#xff0c;比如调度任务信息&#xff0c;离线hive表&#xff0c;实时topic&#xff0c;字段信息&#xff0c;存储信息&#xff0c;质量信息&#xff0c;热度信息等。在数据平台建设初期&#xff0c;这类数据主要散落于各种平台子系统的数…

STM32H7的Cache学习和应用

STM32H7的Cache学习和应用 啥是Cache&#xff1f;Cache的配置配置 Non-cacheable配置 Write through&#xff0c;read allocate&#xff0c;no write allocate配置 Write back&#xff0c;read allocate&#xff0c;no write allocate配置 Write back&#xff0c;read allocate…

05 SQL进阶 -- 复杂查询方法 -- 视图与子查询

1. 视图 我们先来看一个查询语句 SELECT stu_name FROM view_students_info; 单从表面上看起来这个语句是和正常的从数据表中查询数据是完全相同的,但其实我们操作的是一个视图。所以从SQL的角度来说操作视图与操作表看起来是完全相同的,那么为什么还会有视图的存在呢?视…

002nodejs详细安装步骤和npm配置

1、Node.js简介 Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行时。Node.js 使用高效、轻量级的事件驱动、非阻塞 I/O 模型。它的包生态系统&#xff0c;npm&#xff0c;是目前世界上最大的开源库生态系统。 2、下载Node.js 官方地址&#xff1a;https://nodejs.org/…

2024年阿里云服务器新购、续费、升级优惠活动和价格表

阿里云服务器租用价格表2024年最新&#xff0c;云服务器ECS经济型e实例2核2G、3M固定带宽99元一年&#xff0c;轻量应用服务器2核2G3M带宽轻量服务器一年61元&#xff0c;ECS u1服务器2核4G5M固定带宽199元一年&#xff0c;2核4G4M带宽轻量服务器一年165元12个月&#xff0c;2核…

SAFe认证Leading SAFe官方认证班/Leading SAFe领导大规模敏捷认证课

课程简介 SAFe – Scaled Agile Framework是目前全球运用最广泛的大规模敏捷框架&#xff0c;也是全球敏捷相关认证成长最快、最被认可、最有价值的规模化敏捷认证&#xff0c;目前全球SAFe认证专业人士已达120万人。 据官方统计&#xff0c;获得新证书的IT专业人士的平均工资…

Linux 系统下对于 MySQL 的初级操作

由于公司老板想把早已封存的服务器陈年老码捣鼓一下&#xff0c;所以找了一个外援&#xff0c;我则是配合提供支持。但是过程并不顺利。至少 5 年以上的间隔&#xff0c;导致外援查看的时候发现很多代码和配置是缺失的&#xff0c;目前卡在数据库部分&#xff0c;而我这边就帮忙…

CorelDRAW2024绿色精简汉化版本安装包下载

CorelDRAW是一款由加拿大Corel公司开发的平面设计软件&#xff0c;主要用于矢量图形制作、排版和编辑。它以其强大的功能和用户友好的界面而广受欢迎&#xff0c;被广泛应用于各个领域&#xff0c;包括设计、广告、出版和印刷等。 CDR2017-2024全版本下载网盘汉化版链接: http…

【RK3399】Ubuntu系统,HDMI输出固定分辨率

在linux系统目录下&#xff1a;/usr/share/X11/xorg.conf.d&#xff0c;新增 screen-resolution.conf文件。 在改文件中添加&#xff1a; Section "Monitor"Identifier "HDMI-1"Option "Primary" "true"Modeline "1280x800_60.0…

区块链游戏:探索未来的可能性与挑战

区块链游戏是一种将区块链技术应用于游戏领域的创新产品&#xff0c;它为游戏行业带来了全新的模式和可能性。本文将深入探讨区块链游戏的优点、挑战和未来趋势&#xff0c;帮助读者了解这一新兴领域。 一、区块链游戏的优点 1. 公平性&#xff1a;区块链技术保证了游戏中的物…

隐式转换和强制转换

一.前言: 数字进行运算时,数据类型不一样不能运算,需要转成一样的,才能运算 二.取值范围 byte-------->short--------------->int------------->long------------------>float----------->double 三.隐式转换 1.概念 把取值范围小的数值转换成取值范围大的数…

在 Next.js App Router 中使用仅在服务端的代码

React Server Components 架构将组件分为客户端和服务端类型&#xff0c;并与 Next.js 的 App Router 集成。 使用 App Router 进行开发时&#xff0c;区分服务端代码和客户端代码对于应用程序的安全性、性能和可维护性至关重要。这篇博文将介绍在 Next.js 应用程序中定义服务…

【前缀合】Leetcode 连续数组

题目解析 525. 连续数组 寻找一个子数组&#xff0c;这个子数组中包含相同数目的0和1&#xff0c;但是这个子数组需要最长的 算法讲解 只需在[0,i]寻找一段区间使得这一段区间的和也等于sum即可 细节问题&#xff1a;1. 这里的哈希表的value存的是下标&#xff0c;因为需要找…

C++STL(stack类、queue类)

文章目录 1.stack类和queue类的介绍2.stack类和queue类的基本用法2.1 (stack)下列代码的运行结果是&#xff08; &#xff09;2.2 (queue)下列代码的运行结果是&#xff08; &#xff09; 3.stack类和queue类的底层(模拟实现)3.1 deque类(双端队列)3.2 适配器模式3.3 stack类的…