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

单链表实现通讯录

之前我们完成了基于顺序表(动态)实现通讯录,现在我们链表学完了,可以尝试着使用链表来实现我们的通讯录。

首先我们要明白我们写的通讯录是由一个个节点组成的,每个节点里存储的就是我们的联系人信息。也就是说 我们需要先写一个单链表,完成单链表的插入,删除等功能。然后在单链表的基础上将单链表中的每个节点存储的数据改为一个联系人 由于这一部分我们之前写过,所以我在这里就不重复写了,大家可以看下我前面的博客。

一、通讯录的具体形式
在这里插入图片描述
二、实现通讯录

(1)、确定链表的类型

在我的双向链表这篇博客里我们了解了链表的分类,我们既写过不带头单向不循环链表,又写过带头双向循环链表。那么我们该如何选择呢?-在这里其实两种链表都可以,难度也是差不多的,因为双链表相较于单链表完善许多,那我们就用单链表来写。

(2)、完成通讯录的思路

首先,通讯录需要完成我们的 增、删联系人,修改联系人,查找联系人,打印通讯录。 这一部分就是我们需要完成的功能。

准备阶段:上面我们知道我们是由一个结构体来储存我们的联系人信息,我们就需要定义一个person联系人的结构体,然后我们之前写的链表里每个节点存储的数据的类型是int型,我们需要将其改为我们现在的person型。联系人的增删查改就是调用我们之前写的单链表的增删等函数,查改这两部分略有差异需要重新来写。

(3)、准备阶段:
contact.h

#define NAME_MAX 20
#define GENDER_MAX 10
#define ADDR_MAX 100
#define NUM_MAX 15
typedef struct person
{char name[NAME_MAX];//姓名char gender[GENDER_MAX];//性别int age;//年龄char addr[ADDR_MAX];//住址char num[NUM_MAX];//电话号码
}person;void ConAdd(contact** ptr);//联系人添加
void ConPrint(contact** ptr);//联系人打印
void ConPop(contact** ptr);//删除联系人
void ConFind(contact** ptr);//查找联系人
void ConGai(contact** ptr);//修改联系人
void ConDesTroy(contact** ptr);//销毁通讯录

ListNode.h

#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#include"单链表contact.h"
typedef person datatype;
typedef struct ListNode
{datatype data;struct ListNode* next;
}ListNode;
void SLprint(ListNode** ptr);//打印
void SLBackPush(ListNode** ptr,datatype x);//单链表的尾插
void SLProntPush(ListNode** ptr, datatype x);//单链表的头插
void SLBackPop(ListNode** ptr);//单链表的尾删
void SLProntPop(ListNode** ptr);//单链表的头删
ListNode* SLFind(ListNode** ptr,datatype x);//链表的查找
void SLPosPush(ListNode** ptr, ListNode* pos, datatype x);//在指定位置插入数据
void SLPosPop(ListNode** ptr,ListNode* pos);//删除指定节点
void SLDesTory(ListNode** ptr);//销毁链表

这里我们需要注意的是因为我们需要将每个结构体里的数据类型换为person那么我们就需要包含contact.h的头文件,但是我们知道我们使用通讯录时其实是调用的外层的单链表结构,所以我们需要将ListNode.h包含在contact.h里,现在就出现了一个尴尬的情况–互相包含。解决的办法就是前置申明,在contact.h中typedef struct ListNode contact;这一段代码不光前置声明了还将外层的链表给改个名。

(4)、增删查改的实现

1、增加联系人,上面我们说过增加联系人就是调用我们的单链表的插入函数,我们写单链表的时候写了单链表的头插与尾插,在这里都可以,但是为了更符合日常我在这里采用尾插。

void ConAdd(contact** ptr)
{assert(ptr);printf("请输入添加的联系人的姓名  性别  年龄  住址  电话\n");person pes;scanf("%s", pes.name);scanf("%s", pes.gender);scanf("%d", &pes.age);//age是整型所以需要&符号scanf("%s", pes.addr);scanf("%s", pes.num);SLBackPush(ptr, pes);
}

这里需要注意的是我们是将整个person结构体定义的变量插入到链表,所以我们需要定义一个联系人的变量,先将联系人赋值,然后再将这整个变量作为我们的数据插入。

2、删除联系人

void ConPop(contact** ptr)
{assert(ptr && *ptr);char NAME[NAME_MAX];//定义一个数组printf("请输入你要删除的联系人的姓名:\n");scanf("%s", NAME);//输入我们要删除的联系人的姓名contact* pcur = *ptr;while (pcur){if (strcmp(pcur->data.name,NAME)==0)//比较输入的字符串和链表中的联系人姓名,名字相同时删除该联系人{if (pcur==*ptr)//当删除的联系人为第一个节点{pcur = pcur->next;free(*ptr);*ptr = pcur;break;}else//删除的联系人不在第一个节点{contact* prev = *ptr;while (prev->next != pcur)//找需要删除的联系人的前一个节点{prev = prev->next;}prev->next = pcur->next;free(pcur);pcur = NULL;break;}}pcur = pcur->next;}
}

删除联系人稍微比较麻烦,首先我们要确定以什么为标准来删除联系人,如果以电话号码来删除,就需要比较两个电话号码的字符串,名字同理,为了符合常理我这里使用名字,确定了以什么为标准以后我们还要考虑需要删除的联系人是否为第一个节点。

如果不为第一个节点,就需要遍历整个链表,找到需要删除的联系人的前一个节点,然后将前一个节点与后一个节点连接,最后释放掉需要删除的节点即可。

如果需要删除的联系人就是第一个节点的话,我们就不需要找前一个节点,直接让指向头结点的指针向后移,然后释放掉原来的头结点。

在这里插入图片描述
以上就是删除时的三种情况,第三种只有一个联系人的情况是可以通过第二种方式的代码解决。

3、查找联系人

同样查找联系人也需要我们以一个标准来选,我这里依然用名字来比较。

void ConFind(contact** ptr)
{assert(ptr && *ptr);char NAME[NAME_MAX];printf("请输入你要查找的联系人的姓名:\n");scanf("%s", NAME);contact* pcur = *ptr;while (pcur){if (strcmp(pcur->data.name, NAME) == 0){printf("姓名  性别  年龄  住址  电话\n");printf("%s  %s  %d  %s  %s\n", pcur->data.name,pcur->data.gender,pcur->data.age,pcur->data.addr,pcur->data.num);}pcur = pcur->next;}
}

这一部分简单许多,直接遍历链表,找到名字相同的节点,然后将该节点存储的联系人信息打印出来即可。

4、修改联系人

同样我这里用名字作为找联系人的标准。

void ConGai(contact** ptr)
{assert(ptr && *ptr);char NAME[NAME_MAX];printf("请输入你要修改的联系人的姓名:\n");scanf("%s", NAME);contact* pcur = *ptr;while (pcur){if (strcmp(pcur->data.name, NAME) == 0){printf("请输入修改后的联系人的姓名  性别  年龄  住址  电话\n");scanf("%s %s %d %s %s",pcur->data.name,pcur->data.gender,&pcur->data.age,pcur->data.addr,pcur->data.num);}pcur = pcur->next;}
}

这里跟上面的找联系人相似,找到后直接输入修改后的联系人的信息,覆盖掉原联系人的信息即可。

(5)、通讯录的销毁

当我们使用完通讯录,我们就需要将这个通讯录的空间给释放掉,那之前我们说有销毁就有初始化,为什么通讯录没有初始化呢?那是因为我们使用这个链表时,使用的是指向这个链表的指针,当我们不进行增删查改等操作时,该指针就为空,不需要进行初始化。

void ConDesTroy(contact** ptr)
{assert(ptr && *ptr);contact* pcur = *ptr;while (pcur){contact* del = pcur->next;free(pcur);pcur = del;}pcur = NULL;
}

销毁链表也比较简单,直接遍历整个链表,遍历一个释放一个。

上面我们完成了通讯录的功能,那么我们就可以将功能组装起来成为我们的通讯录。

#include"ListNode.h"
#include"单链表contact.h"
void menu()
{printf("***************************************\n");printf("*************单链表通讯录**************\n");printf("*******1、添加联系人  2、删除联系人****\n");printf("*******3、查找联系人  4、修改联系人****\n");printf("*******5、打印联系人  0、退出通讯录****\n");printf("***************************************\n");
}int main()
{contact* phead=NULL;int input = 0;do{menu();printf("请输入你的选项:\n");scanf("%d", &input);switch (input){case 1:ConAdd(&phead);break;case 2:ConPop(&phead);break;case 3:ConFind(&phead);break;case 4:ConGai(&phead);break;case 5:ConPrint(&phead);break;case 0:ConDesTroy(&phead);printf("退出成功");break;default:printf("选项错误,请重新输入:");break;}} while (input);return 0;
}

像这样我们就可以通过输入的数字来进行我们的通讯录操作。

上面我已经给出了contact.h ListNode.h test.c的代码,下面是其他部分的代码:
ListNode.c

#include"ListNode.h"ListNode* buynode(datatype x)
{ListNode* node = (ListNode*)malloc(sizeof(ListNode));if (node == NULL){perror("malloc");exit(1);}node->data = x;node->next = NULL;return node;
}void SLBackPush(ListNode** ptr,datatype x)
{assert(ptr);ListNode* node = buynode(x);if (*ptr == NULL){*ptr = node;}else{ListNode* ptail = *ptr;while (ptail->next != NULL){ptail = ptail->next;}ptail->next = node;}
}//void SLprint(ListNode** ptr)
//{
//	assert(ptr);
//	ListNode* pcur = *ptr;
//	while (pcur)
//	{
//		printf("%d ", pcur->data);
//		pcur = pcur->next;
//	}
//	printf("\n");
//}void SLProntPush(ListNode** ptr, datatype x)
{assert(ptr);ListNode* node = buynode(x);if (*ptr == NULL){*ptr = node;}else{node->next = *ptr;*ptr = node;}
}void SLBackPop(ListNode** ptr)
{assert(ptr);if ((*ptr)->next==NULL){free(*ptr);*ptr = NULL;}else{ListNode* pcur = *ptr;while (pcur->next->next){pcur = pcur->next;}ListNode* del = pcur->next;free(del);pcur->next = NULL;del = NULL;}
}void SLProntPop(ListNode** ptr)
{assert(ptr && *ptr);ListNode* del = *ptr;*ptr = (*ptr)->next;free(del);del = NULL;
}//ListNode* SLFind(ListNode** ptr, datatype x)
//{
//	assert(ptr && *ptr);
//	ListNode* pcur = *ptr;
//	while (pcur)
//	{
//		if (pcur->data == x)
//		{
//			return pcur;
//		}
//		pcur = pcur->next;
//	}
//	return NULL;
//}void SLPosPush(ListNode** ptr, ListNode* pos, datatype x)
{assert(ptr && *ptr && pos);if (pos == *ptr){SLProntPush(ptr, x);}else{ListNode* node = buynode(x);ListNode* pcur = *ptr;while (pcur->next != pos){pcur = pcur->next;}node->next = pos;pcur->next = node;}
}void SLPosPop(ListNode** ptr, ListNode* pos)
{assert(ptr&&*ptr&&pos);if (pos == *ptr){SLProntPop(ptr);}else{ListNode* pcur = *ptr;while (pcur->next != pos){pcur = pcur->next;}pcur->next = pos->next;free(pos);pos = NULL;}
}void SLDesTory(ListNode** ptr)
{assert(ptr);ListNode* pcur = *ptr;while (pcur){ListNode* del = pcur->next;pcur = pcur->next;free(pcur);pcur = del;}pcur = NULL;*ptr = NULL;
}

contact.c

#include"单链表contact.h"
#include"ListNode.h"void ConAdd(contact** ptr)
{assert(ptr);printf("请输入添加的联系人的姓名  性别  年龄  住址  电话\n");person pes;scanf("%s", pes.name);scanf("%s", pes.gender);scanf("%d", &pes.age);scanf("%s", pes.addr);scanf("%s", pes.num);SLBackPush(ptr, pes);
}void ConPrint(contact** ptr)
{assert(ptr);printf("姓名  性别  年龄  住址  电话\n");contact* pcur = *ptr;while (pcur){printf("%s    %s     %d    %s    %s\n", pcur->data.name,pcur->data.gender,pcur->data.age,pcur->data.addr,pcur->data.num);pcur = pcur->next;}
}void ConPop(contact** ptr)
{assert(ptr && *ptr);char NAME[NAME_MAX];printf("请输入你要删除的联系人的姓名:\n");scanf("%s", NAME);contact* pcur = *ptr;while (pcur){if (strcmp(pcur->data.name,NAME)==0){if (pcur==*ptr){pcur = pcur->next;free(*ptr);*ptr = pcur;break;}else{contact* prev = *ptr;while (prev->next != pcur){prev = prev->next;}prev->next = pcur->next;free(pcur);pcur = NULL;break;}}pcur = pcur->next;}
}void ConFind(contact** ptr)
{assert(ptr && *ptr);char NAME[NAME_MAX];printf("请输入你要查找的联系人的姓名:\n");scanf("%s", NAME);contact* pcur = *ptr;while (pcur){if (strcmp(pcur->data.name, NAME) == 0){printf("姓名  性别  年龄  住址  电话\n");printf("%s  %s  %d  %s  %s\n", pcur->data.name,pcur->data.gender,pcur->data.age,pcur->data.addr,pcur->data.num);}pcur = pcur->next;}
}void ConGai(contact** ptr)
{assert(ptr && *ptr);char NAME[NAME_MAX];printf("请输入你要修改的联系人的姓名:\n");scanf("%s", NAME);contact* pcur = *ptr;while (pcur){if (strcmp(pcur->data.name, NAME) == 0){printf("请输入修改后的联系人的姓名  性别  年龄  住址  电话\n");scanf("%s %s %d %s %s",pcur->data.name,pcur->data.gender,&pcur->data.age,pcur->data.addr,pcur->data.num);}pcur = pcur->next;}
}void ConDesTroy(contact** ptr)
{assert(ptr && *ptr);contact* pcur = *ptr;while (pcur){contact* del = pcur->next;free(pcur);pcur = del;}pcur = NULL;
}

最终实现的形式如下
在这里插入图片描述

相关文章:

单链表实现通讯录

之前我们完成了基于顺序表&#xff08;动态&#xff09;实现通讯录&#xff0c;现在我们链表学完了&#xff0c;可以尝试着使用链表来实现我们的通讯录。 首先我们要明白我们写的通讯录是由一个个节点组成的&#xff0c;每个节点里存储的就是我们的联系人信息。也就是说 我们需…...

Linux 命令操作技巧

Linux命令行界面提供了丰富的快捷键来提高操作效率&#xff0c;以下是一些常用的Linux终端快捷键&#xff0c;主要基于Bash shell&#xff1a; Tab - 自动补全&#xff1a;输入命令、文件名、目录名或命令选项的开头部分&#xff0c;然后按Tab键&#xff0c;系统会自动补全剩余…...

深度学习21天 —— 卷积神经网络(CNN):识别验证码( 第12天)

目录 一、前期准备 1.1 标签数字化 1.2 加载数据 1.3 配置数据 二、其他 2.1 损失函数 categorical_crossentropy 2.2 plt.legend(loc ) 2.3 history.history 活动地址&#xff1a;CSDN21天学习挑战赛 学习&#xff1a;深度学习100例-卷积神经网络&#xff08;CNN&…...

利用 Docker 简化Redis部署:快速搭建Redis服务

利用 Docker 简化Redis部署&#xff1a;快速搭建Redis服务 目录 利用 Docker 简化Redis部署&#xff1a;快速搭建Redis服务为什么选择 Docker准备工作拉取Redis镜像快速运行Redis容器验证Redis服务总结 在现代软件开发中&#xff0c;Redis作为一种高性能的键值数据库&#xff0…...

Web前端框架:深入探索与实践

Web前端框架&#xff1a;深入探索与实践 在当下数字化飞速发展的时代&#xff0c;Web前端框架的选择与应用成为了开发者们关注的焦点。Node.js&#xff0c;作为一种强大的后端技术&#xff0c;在前端框架的构建中也发挥着不可或缺的作用。本文将围绕Node.js Web前端框架&#…...

【算法】贪心算法——柠檬水找零

题解&#xff1a;柠檬水找零(贪心算法) 目录 1.题目2.题解3.参考代码4.证明5.总结 1.题目 题目链接&#xff1a;LINK 2.题解 分情况讨论 贪心算法 当顾客为5元时&#xff0c;收下当顾客为10元时&#xff0c;收下10元并找回5元当顾客为20元时&#xff0c;收下20元并找回10…...

Jmeter安装教程

1 Jmeter下载 Jmeter下载地址&#xff1a;https://jmeter.apache.org/download_jmeter.cgi&#xff0c;选择需要的版本点击下载 解压jmeter安装包 解压后的安装包如下&#xff1a; 2 配置Jmeter环境变量 进入环境变量配置页面&#xff1a;计算机->属性->高级系统设置-&…...

关于磁盘管理

磁盘管理是操作系统提供的一项功能&#xff0c;用于高效地组织、维护和控制计算机的硬盘驱动器及其卷&#xff08;分区&#xff09;。通过磁盘管理工具&#xff0c;用户和管理员可以执行多种与存储相关的高级任务&#xff0c;主要包括&#xff1a; 初始化新磁盘&#xff1a; …...

人大金仓数据库大小写不敏感确认

1、图形化确认(管理—其他选项—预设选项) 2、命令行确认 # ksql -p 54321 -U system test # show enable_ci; 查看是否大小写敏感&#xff0c;on表示大小敏感&#xff0c;off表示大小写不敏感&#xff0c;使用某些项目的时候&#xff0c;需要设置数据库大小写不敏感&#…...

【Java】还有人不懂继承?25 个 Case 包教包会

还有人不懂继承&#xff1f;25 个 Case 包教包会 1.Implement single inheritance2.Implement multilevel inheritance3.Implement hierarchical inheritance4.Override a base class method into a derived class5.Demonstrate the protected access specifier6.Create an Stu…...

Qt实现窗口失去焦点抖动功能

一、失去焦点检测 当窗口失去焦点时会发出FocusOut事件&#xff0c;具体实现如下&#xff1a; 首先给窗口安装事件过滤器&#xff1a; this->installEventFilter(this);然后在事件过滤器函数中判断有没有失去焦点 bool MessageDialog::eventFilter(QObject *object, QEve…...

Flink 数据源

原理 在 Flink 中&#xff0c;数据源&#xff08;Source&#xff09;是其中一个核心组件&#xff0c;负责从各种来源读取数据供 Flink 程序处理。 Flink 的数据源类型丰富&#xff0c;涵盖了从简单测试到生产环境使用的各种场景。Kafka、Socket、文件和集合是 Flink 中最常见…...

在本地电脑中如何用命令操作远程服务器上的数据库

日常做服务器维护&#xff0c;经常操作的2个事情&#xff0c;一个是备份远程服务器上的数据库到本地电脑&#xff0c;一个是将备份下来的数据库是恢复到本机做测试用。下面以阿里云的mysql为例&#xff0c;看看怎么弄。电脑是win10系统&#xff0c;先打开cmd命令行模式&#xf…...

uniApp子组件监听数据的变化的方法之一

props:{//用来接收外界传递过来的数据swiperList:{type:Array,default:[]}}, swiperList&#xff1a;是父组件传递过来的值 通过 watch 监听&#xff08;在父组件中也同样可以使用&#xff0c;跟VUE的监听数据变化同理&#xff09; watch:{//监听组件中的数据变化swiperList(ol…...

Python容器化技术的15个Docker实践

今天&#xff0c;我们将一起探索如何利用Docker这一强大的容器化工具&#xff0c;来提升你的Python项目开发、部署效率。通过一系列由浅入深的实践案例&#xff0c;你将学会如何将Python应用装入“小盒子”&#xff0c;让它在任何地方都能轻松运行。 1. Docker入门&#xff1a…...

QT天气预报项目(写在简历上)

一、ui设计 实现功能:可以搜索不同的城市进行天气的查询,并且显示未来7天内的天气,并绘制出当天的最高气温和最低气温曲线图。 学到的知识: stylesheet界面美化 Json数据解析 HTTP通信get请求 使用事件过滤器绘制温度曲线 多控件处理(利用数组) 代码整合调试能力 二…...

从零到一建设数据中台 - 数据可视化

从零到一建设数据中台(八)- 数据可视化 一、数据可视化大屏 数据可视化是借助于图形化手段,清晰有效地传达与沟通信息。 将一些业务的关键指标通过数据可视化的方式展示到一块或多块LED大屏上,以大屏为主要展示载体的数据可视化设计。 在数据可视化大屏构建过程中,为了…...

一步步实现知乎热榜采集:Scala与Sttp库的应用

背景 在大数据时代&#xff0c;网络爬虫技术发挥着不可或缺的作用。它不仅能够帮助我们快速地获取互联网上的信息&#xff0c;还能处理和分析这些数据&#xff0c;为我们提供深刻的洞察。知乎&#xff0c;作为中国领先的问答社区&#xff0c;汇聚了各行各业的专家和广大用户的…...

Windows和Linux系统部署Docker(2)

目录 一、Linux系统部署docker 前置环境&#xff1a; 1.安装需要的软件包&#xff0c; yum-util 提供yum-config-manager功能 2.添加阿里云 docker-ce 仓库 3.安装docker软件包 4.启动 docker并设置开机自启 5.查看版本&#xff1a; 二、windows系统部署docker 1.查看…...

PyCharm中快速搭建Python虚拟环境的指南

在 PyCharm 中创建一个新的 Python 虚拟环境可以帮助你为不同的项目管理不同的依赖包&#xff0c;避免版本冲突。以下是在 PyCharm 中创建虚拟环境的步骤&#xff1a; 打开或创建一个项目: 如果你还没有打开 PyCharm&#xff0c;首先打开它&#xff0c;然后选择“Open”打开一个…...

C++模板元编程

C模板元编程 为什么需要模板函数&#xff1f; 避免重复写代码 模板函数定义 使用template <class T> 或者template <typename T>其中T是可以变成任何类型调用时候T会替换成需要的类型 twice<int>会将T替换成int template <class T> T twice(T t) {re…...

Lambda表达式与函数式接口

### 泛型&#xff08;Generics&#xff09; 泛型是Java SE 5引入的一个重要特性&#xff0c;它允许在类、接口和方法中使用类型参数&#xff0c;从而提供编译时的类型安全检查和更高的重用性。java public class GenericsExample {public static <T> void printList(Li…...

Java字符串String详解

Java中的String类作为存储和操作文本数据的基本类型&#xff0c;是开发过程中最常用的类型。 String类型的声明及初始化与基本数据类型非常相似&#xff1a; String name "lcy";但是String类型是引用类型&#xff0c;有着非常丰富的处理字符串的方法。正是因为其重…...

互联网政务应用安全管理规定:使用安全连接方式访问

前几日&#xff0c;由中央网络安全和信息化委员会办公室、中央机构编制委员会办公室、工业和信息化部、公安部等4部门联合制定的《互联网政务应用安全管理规定》&#xff08;以下简称规定&#xff09;发布了&#xff0c;规定定义了互联网政务应用&#xff0c;也对互联网政务应用…...

安全测试用例及解析(Word原件,直接套用检测)

5 信息安全性测试用例 5.1 安全功能测试 5.1.1 标识和鉴别 5.1.2 访问控制 5.1.3 安全审计 5.1.4 数据完整性 5.1.5 数据保密性 5.1.6 软件容错 5.1.7 会话管理 5.1.8 安全漏洞 5.1.9 外部接口 5.1.10 抗抵赖 5.1.11 资源控制 5.2 应用安全漏洞扫描 5.2.1 应用安全漏洞扫描 5.3…...

github将默认分支main改为master

github将默认分支main改为master 1.进入github&#xff0c;点击setting 2.在setting中&#xff0c;选择Respositories&#xff0c;更新默认分支为master 3.选择要更新的项目&#xff0c;在项目中选择setting->general->切换默认分支...

java.lang.NoClassDefFoundError: org/dom4j/io/SAXReader

问题描述&#xff1a;在maven项目中&#xff0c;给SAXReader创建实例&#xff0c;启动tomcat服务器后报异常java.lang.NoClassDefFoundError: org/dom4j/io/SAXReader。我在pom文件中是引入了dom4j依赖得&#xff0c;但是不知道为什么在上传到web时就找不到了 解决办法&#x…...

读后感:《SQL数据分析实战》运营SQL实用手册

学习SQL&#xff0c;先有用起来&#xff0c;有了使用价值&#xff0c;之后才是去了解它的原理&#xff0c;让使用更加顺畅。 在大部分业务场景中&#xff0c;通过SQL可以快速的实现数据处理与统计。《SQL数据分析实战》区别于其他工具书&#xff0c;它并没有介绍SQL是什么&…...

建设人工智能平台,主流GPU卡选型分析

国内外主流GPU卡性能分析&#xff01;2024&#xff01; 大模型兴起助推算力需求激增 2024年&#xff0c;深度学习与人工智能技术飞速跃进&#xff0c;Transformer、GPT-3等大模型在自然语言处理、图像识别、语音合成等领域大放异彩&#xff0c;开启AI新纪元。其庞大的参数与数…...

RTSPtoWebRTC、RTSPtoWeb ( 自HTML播放):页面中预览摄像机视频,无插件的播放方式,适合局域网使用,无需流媒体服务器

文章目录 引言I 环境准备II RTSPtoWebRTC2.1 下载和编译2.2 配置config.jsonIII RTSPtoWebRTC问题优化: 使用http接口生成视频资源进行播放3.1 调用http接口生成视频资源进行播放3.2 启动关闭IV RTSPtoWeb4.1 config.json4.2 RTSPPlayersee also引言 需求: 海域感知,云台监控…...

C语言| 三个整数从小到大排序

【分析思路】 三个整数从小到大排序 这个程序的算法是&#xff1a; 先把第一个数num1跟它后面所有的数相比较&#xff0c;找出最小的&#xff0c;通过中间变量temp交换,赋给num1&#xff1b; 接着中间值num2和它后面所有的数相比较&#xff0c;找出第二小的&#xff0c;然后赋给…...

C语言基础编程题目解析:探索逻辑与算法的奥秘

C语言基础编程题目解析&#xff1a;探索逻辑与算法的奥秘 在编程的世界里&#xff0c;C语言作为一门基础且强大的编程语言&#xff0c;其题目往往涵盖了丰富的逻辑和算法知识。下面&#xff0c;我们将从四个方面、五个方面、六个方面和七个方面&#xff0c;对一系列C语言基础编…...

jmeter基础入门练习题

jmeter存在A,B两个线程组的情况下&#xff0c;默认设置下&#xff0c;运行顺序是&#xff1a;A A&#xff1a;A,B同时运行 B&#xff1a;先运行A&#xff0c;在运行B C&#xff1a;先运行A&#xff0c;等待2s运行B D:先A运行完&#xff0c;等待默认设置时间后运行B 下列说法正…...

大数据技术原理(三):HDFS 最全面的 API 操作,你值得收藏

&#xff08;实验二 熟悉常用的HDFS操作&#xff09; -------------------------------------------------------------------------------------------------------------------------------- 一、实验目的 1.理解 HDFS在 Hadoop体系结构中的角色。 HDFS是一个分布式文件系…...

Flink系列二:DataStream API中的Source,Transformation,Sink详解(^_^)

在上面篇文章中已经对flink进行了简单的介绍以及了解了Flink API 层级划分&#xff0c;这一章内容我们主要介绍DataStream API 流程图解&#xff1a; 一、DataStream API Source Flink 在流处理和批处理上的 source 大概有 4 类&#xff1a; &#xff08;1&#xff09;基于本…...

最好的电脑数据恢复软件是什么

由于硬件故障、恶意软件攻击或意外删除而丢失文件可能会造成巨大压力。数据丢失会扰乱日常运营&#xff0c;造成宝贵的业务时间和资源损失。在这些情况下&#xff0c;数据恢复软件是检索丢失或损坏数据的最简单方法。 数据恢复软件何时起作用&#xff1f; 对于 Windows 数据恢…...

机器学习模型调试学习总结

1.学习内容 模型调试方法&#xff1a;冻结部分层&#xff0c;训练剩余层 实践&#xff1a;在一个预训练的 BERT 模型上冻结部分层&#xff0c;并训练剩余的层 模型调试方法&#xff1a;线性探测&#xff08;Linear Probe&#xff09; 实践&#xff1a;在一个预训练的 BERT …...

文明互鉴促发展——2024“国际山地旅游日”主题活动在法国启幕

5月29日&#xff0c;2024“国际山地旅游日”主题活动在法国尼斯市成功举办。中国驻法国使领馆、法国文化旅游部门、地方政府、国际组织、国际山地旅游联盟会员代表、旅游机构、企业、专家、媒体等围绕“文明互鉴的山地旅游”大会主题和“气候变化与山地旅游应对之策”论坛主题展…...

【C++进阶】深入STL之string:掌握高效字符串处理的关键

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ ⏩收录专栏⏪&#xff1a;C “ 登神长阶 ” &#x1f921;往期回顾&#x1f921;&#xff1a;C模板入门 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀STL之string &#x1f4d2;1. STL基本…...

一、初识Qt 之 Hello world

一、初识Qt 之 Hello world 提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 初识Qt 之 Hello world文章目录 一、Qt 简介二、Qt 获取安装三、Qt 初步使用四、Qt 之 Hello world1.新建一个项目 总结 一、Qt 简介 C &#xf…...

nginx搭建简单负载均衡demo(springboot)

目录 1 安装nignx 1.1 执行 brew install nginx 命令&#xff08;如果没安装brew可百度搜索如何安装brew下载工具。类似linux的yum命令工具&#xff09;。 1.2 安装完成会有如下提示&#xff1a;可以查看nginx的配置文件目录。 1.3 执行 brew services start nginx 命令启动…...

SpringBoot的第二大核心AOP系统梳理

目录 1 事务管理 1.1 事务 1.2 Transactional注解 1.2.1 rollbackFor 1.2.2 propagation 2 AOP 基础 2.1 AOP入门 2.2 AOP核心概念 3. AOP进阶 3.1 通知类型 3.2 通知顺序 3.3 切入点表达式 execution切入点表达式 annotion注解 3.4 连接点 1 事务管理 1.1 事务…...

react、vue动态form表单

需求在日常开发中反复写form 是一种低效的开发效率&#xff0c;布局而且还不同这就需要我们对其封装 为了简单明了看懂代码&#xff0c;我这里没有组件&#xff0c;都放在一起&#xff0c;简单抽离相信作为大佬的你&#xff0c;可以自己完成&#xff0c; 一、首先我们做动态f…...

halcon程序如何导出C#文件

1.打开halcon文件&#xff1b; 2.写好需要生成C#文件的算子或函数&#xff1b; 3.找到档案-输出&#xff0c;如下图&#xff1b; 4.点击输出&#xff0c;弹出如下窗口 &#xff08;1&#xff09;可以修改导出文件的存储路径 &#xff08;2&#xff09;选择C#-HALCON/.NET &…...

RabbitMQ三、springboot整合rabbitmq(消息可靠性、高级特性)

一、springboot整合RabbitMQ&#xff08;jdk17&#xff09;&#xff08;创建两个项目&#xff0c;一个生产者项目&#xff0c;一个消费者项目&#xff09; 上面使用原生JAVA操作RabbitMQ较为繁琐&#xff0c;很多的代码都是重复书写的&#xff0c;使用springboot可以简化代码的…...

第八十九周周报

学习目标&#xff1a; 论文 学习时间&#xff1a; 2024.05.25-2024.05.31 学习产出&#xff1a; 一、论文 SAN: INDUCING METRIZABILITY OF GAN WITH DISCRIMINATIVE NORMALIZED LINEAR LAYER 将GAN与切片最优输运联系起来&#xff0c;提出满足方向最优性、可分离性和单射…...

Centos升级Openssh版本至openssh-9.3p2

一、启动Telnet服务 为防止升级Openssh失败导致无法连接ssh&#xff0c;所以先安装Telnet服务备用 1.安装telnet-server及telnet服务 yum install -y telnet-server* telnet 2.安装xinetd服务 yum install -y xinetd 3.启动xinetd及telnet并做开机自启动 systemctl enable…...

茉莉香飘,奶茶丝滑——周末悠闲时光的绝佳伴侣

周末的时光总是格外珍贵&#xff0c;忙碌了一周的我们&#xff0c;终于迎来了难得的闲暇。这时&#xff0c;打开喜欢的综艺&#xff0c;窝在舒适的沙发里&#xff0c;再冲泡一杯香飘飘茉莉味奶茶&#xff0c;一边沉浸在剧情的海洋中&#xff0c;一边品味着香浓丝滑的奶茶&#…...

揭秘:Java字符串对象的内存分布原理

先来看看下面寄到关于String的真实面试题&#xff0c;看看你废不废&#xff1f; String str1 "Hello"; String str2 "Hello"; String str3 new String("Hello"); String str4 new String("Hello");System.out.println(str1 str2)…...

Vue.js - 生命周期与工程化开发【0基础向 Vue 基础学习】

文章目录 Vue 的生命周期Vue 生命周期的四个阶段Vue 生命周期函数&#xff08;钩子函数 工程化开发 & 脚手架 Vue CLI**开发 Vue 的两种方式&#xff1a;**脚手架目录文件介绍项目运行流程组件化开发 & 根组件App.vue 文件&#xff08;单文件组件&#xff09;的三个组成…...