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

单链表的实现 | 附学生信息管理系统的实现

目录

1.前言:

2.单链表的相关概念:

2.1定义:

2.2形式:

2.3特点:

3.常见功能及代码 :

3.1创建节点:

3.2头插:

3.3尾插:

3.4头删:

3.5尾删:

3.6插入(指定位置pos之前)

3.7插入(在指定位置pos之后)

3.8删除(指定位置pos前)

3.9删除(指定位置pos之后)

3.10打印链表:

3.11查找

3.12销毁链表:

4.总代码:

4.1 SList.h

4.2 SList.c

4.3 test.c

5.附:学生信息管理与信息系统:

6.总结:


1.前言:

今天,小邓儿带咱们来看看一个常见的数据结构——“单链表”。通过今天的学习,你将熟练地掌握单链表,还可以将其应用在学生信息管理系统中。废话不多说,咱们开始今天的探秘。

2.单链表的相关概念:

2.1定义:

单链表(Singly Linked List)是一种链式存储的线性数据结构,由一系列节点(Node)组成,每个节点包含两个部分:

  • 数据域(Data):存储实际的数据元素。
  • 指针域(Next):存储指向下一个节点的引用(或指针)。

2.2形式:

以整型数据为例:

2.3特点

  • 节点通过指针依次连接,形成链状结构。
  • 最后一个节点的指针域为 null(或 None),表示链表的结束。
  • 链表的大小是动态的,可以灵活地插入和删除节点。

3.常见功能及代码 :

3.1创建节点:

3.2头插:

思路:

1.定义一个新节点newnode;

2.newnode的下一个结点指向头节点;

3.将newnode作为新的头节点。

代码:

3.3尾插:

思路:

1.判断该链表是否为空。若是空链表,同头插思路相同;

2.若是不为空。遍历链表,将最后一个节点的下一个节点,指向新节点。

代码:

3.4头删:

思路:

1.判空。若为空,返回NULL;

2.不为空,定义一个next指针(指向头节点下一个节点);

3.将next作为新的头节点。

代码:

3.5尾删:

思路:

1.判空。若为空,返回NULL;

2.不为空,定义一个pre指针指向NULL,再定义一个ptail指针遍历链表;

3.当ptail的下一个节点不为空,将pre指向ptail所在位置,ptail继续遍历链表,直至ptail下一个指针为空;

4.此时,将pre的下一个指针指为空,并释放ptail指针空间。

代码:

3.6插入(指定位置pos之前)

思路:

1.判空。若为空,调用头插;

2.不为空,定义一个新节点newnode来存储要插入的数据;

3.在定义一个pre指针指向头节点(用来寻找*pos);

4.找到pos后,将pre的下一个节点指向newnode节点,并将newnode的下一个节点指向pos;

代码:

3.7插入(在指定位置pos之后)

思路:

1.判空。若为空,调用头插;

2.不为空,定义一个新节点newnode来存储要插入的数据;

3.将newnode的下一个节点指向pos的下一个节点;

4.再将pos的下一个节点指向newnode.(注意:这里的3、4步骤不可以颠倒

正常思路:

如果颠倒:(newnode的下一个节点,就不能指向原先4所在的节点。只能指向newnode节点)

代码:

3.8删除(指定位置pos前)

思路:

1.判断pos是否为头节点,是的话,头删;

2.不是头节点,定义一个pcur节点指向头节点;

3.用pcur来遍历链表,直至pcur的下一个节点是pos;

4.此时,将pcur的下一个节点指向pos的下一个节点,并释放pos节点的空间。

代码:

3.9删除(指定位置pos之后)

思路:

1.判断pos是否为头节点,是的话,头删;

2.不是头节点,定义一个pcur节点指向pos的下一个节点;

3.将pos的下一个节点指向pcur的下一个节点。

代码:

3.10打印链表:

代码:

3.11查找:

代码:

3.12销毁链表:

代码:

4.总代码:

4.1 SList.h

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
typedef int SLDateType;
typedef struct SLNode
{SLDateType data;struct Node* next;
}Node;
Node* BuyNode(SLDateType X);
//打印
void SLPrintf(Node*plist);
//尾插
void SLPushBack(Node** plist, SLDateType X);
//头插
void SLPushFront(Node** plist, SLDateType X);
//尾删
void SLPopback(Node** plist);
//头删
void SLPopFront(Node** plist);
//查找
Node* SLSearch(Node* plist, SLDateType X);
//指定位置前插入
void SLInsert(Node** plist, Node*pos,SLDateType X);
//指定位置之后插入
void SLInsertAfter(Node** plist, Node* pos, SLDateType X);
//删除指定位置的数据
void SLErase(Node** plist, Node* pos);
//删除指定节点后的数据
void SLEraseAfter( Node**plist,Node* pos);
//销毁
void SLDestory(Node** plist);

4.2 SList.c

#include"SList.h"
Node* BuyNode(SLDateType X)
{Node* newnode = (Node*)malloc(sizeof(SLDateType));if (newnode == NULL){perror("malloc fail\n");return NULL;}newnode->data = X;newnode->next = NULL;return newnode;
}
void SLPrintf(Node* plist)
{if(plist==NULL){exit(1);}Node* pcur = plist;while (pcur){printf("%d->", pcur->data);pcur = pcur->next;}printf("NULL\n");
}
void SLPushBack(Node** phead, SLDateType X)
{assert(phead);Node* newnode = BuyNode(X);if (*phead == NULL){*phead = newnode;}else{Node* ptail = *phead;while (ptail->next){ptail = ptail->next;}ptail->next = newnode;}
}
void SLPushFront(Node** phead, SLDateType X)
{assert(phead);Node* newnode = BuyNode(X);newnode->next = *phead;*phead = newnode;
}
void SLPopback(Node** plist)
{assert(plist&&*plist);if ((plist && *plist) == NULL){free(*plist);*plist= NULL;}else{Node* pre = NULL;Node* ptail =* plist;while (ptail->next){pre = ptail;ptail = ptail->next;}pre->next = NULL;free(ptail);ptail = NULL;}
}
void SLPopFront(Node** plist)
{assert(plist && *plist);if ((plist && *plist) == NULL){free(*plist);*plist = NULL;}else{Node*next=(*plist)->next;free(*plist);*plist = next;}
}
Node* SLSearch(Node* plist, SLDateType X)
{assert(plist);Node* pcur = plist;while (pcur->data != X){pcur = pcur->next;}if (pcur->next){return pcur;}else return NULL;
}
void SLInsert(Node**plist,Node*pos, SLDateType X)
{assert(plist && pos);if (pos == plist){SLPushFront;}else{Node* newnode=BuyNode(X);Node* pre = *plist;while (pre->next != pos){pre = pre->next;}pre->next = newnode;newnode->next= pos;}
}
void SLInsertAfter(Node** plist, Node* pos, SLDateType X)
{assert(plist && pos);if (pos == plist){SLPushFront;}else{Node* newnode = BuyNode(X);newnode->next = pos->next;pos->next = newnode;}
}
void SLErase(Node** plist, Node* pos)
{assert(plist && pos);if (pos == *plist){SLPopFront(&plist);}else {Node* pcur = *plist;while((pcur->next) != pos){pcur = pcur->next;}pcur->next = pos->next;free(pos);pos = NULL;}
}
void SLEraseAfter(Node**plist, Node* pos)
{assert( pos);Node* pcur = pos->next;pos->next = pcur->next;free(pcur);pcur = NULL;
}
void SLDestory(Node** plist)
{Node* pcur = *plist;while (pcur){Node* pre = pcur->next;free(pcur);pcur = pre;}*plist = NULL;
}

4.3 test.c

#include"SList.h"
void test1()
{Node* p1 = (Node*)malloc(sizeof(Node));Node* p2 = (Node*)malloc(sizeof(Node));Node* p3 = (Node*)malloc(sizeof(Node));assert(p1&&p2&&p3);if (p1 == NULL){return 0;}p1->data = 1;p2->data = 2;p3->data = 3;p1->next = p2;p2->next = p3;p3->next = NULL;Node* plist = p1;SLPrintf(plist);
}
void test2()
{Node* plist = NULL;SLPushBack(&plist, 1);SLPushBack(&plist, 2);SLPushBack(&plist, 3);SLPushBack(&plist, 4);//SLPrintf(plist);SLPushFront(&plist, 5);SLPrintf(plist);SLPopback(&plist);SLPrintf(plist);SLPopFront(&plist);SLPrintf(plist);Node* P = SLSearch(plist, 2);if (P){printf("找到%d了\n", P->data);}else printf("未找到\n");SLInsert(&plist, P, 6);//SLPrintf(plist);SLInsertAfter(&plist, P, 7);SLPrintf(plist);SLErase(&plist, P);SLPrintf(plist);SLEraseAfter(&plist,7);SLPrintf(plist);SLDestory(plist);
}int main()
{test2();return 0;
}

5.附:学生信息管理与信息系统:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <assert.h>typedef struct Student {char id[10];char name[20];float score;
} Stu;typedef struct LinkNode {Stu* data;struct LinkNode* next;
} Node;// 初始化单链表
void InitList(Node** L) {*L = (Node*)malloc(sizeof(Node));if (*L == NULL) {perror("malloc failed!\n");exit(1);}(*L)->next = NULL;(*L)->data = NULL;
}// 创建新结点
Node* CreateNode(Stu* x) {Node* newNode = (Node*)malloc(sizeof(Node));if (newNode == NULL) {perror("malloc failed!\n");exit(1);}newNode->data = x;newNode->next = NULL;return newNode;
}// 插入记录(尾插)
void Insert(Node** L, Stu* x) {Node* newNode = CreateNode(x);if (*L == NULL) {*L = newNode;}else {Node* ptail = *L;while (ptail->next) {ptail = ptail->next;}ptail->next = newNode;}
}// 查找功能1:按姓名查找
Node* SearchByName(Node* L, char* name) {Node* pcur = L->next;while (pcur) {if (strcmp(pcur->data->name, name) == 0) {return pcur;}pcur = pcur->next;}return NULL;
}// 查找功能2:按学号查找
Node* SearchByID(Node* L, char* id) {Node* pcur = L->next;while (pcur) {if (strcmp(pcur->data->id, id) == 0) {return pcur;}pcur = pcur->next;}return NULL;
}// 删除功能:按学号删除记录
void Delete(Node** L, char* id) {Node* c = SearchByID(*L, id);if (c == NULL) {printf("未找到学号为 %s 的记录!\n", id);return;}Node* pre = *L;while (pre->next != c) {pre = pre->next;}pre->next = c->next;free(c->data);free(c);printf("删除成功!\n");
}// 修改功能:按学号修改记录
void Change(Node** L, char* id) {Node* c = SearchByID(*L, id);if (c == NULL) {printf("未找到学号为 %s 的记录!\n", id);return;}Stu* s = (Stu*)malloc(sizeof(Stu));if (s == NULL) {perror("malloc failed!\n");exit(1);}printf("请输入修改后的信息(学号 姓名 成绩):\n");scanf("%s%s%f", s->id, s->name, &s->score);strcpy(c->data->id, s->id);strcpy(c->data->name, s->name);c->data->score = s->score;free(s);printf("修改成功!\n");
}// 输出所有记录
void DispList(Node* L) {Node* pcur = L->next;if (!pcur) {printf("链表为空,无记录可显示!\n");return;}printf("所有记录如下:\n");while (pcur) {printf("学号:%s,姓名:%s,成绩:%.2f\n",pcur->data->id, pcur->data->name, pcur->data->score);pcur = pcur->next;}
}// 销毁链表
void Destroy(Node** L) {Node* pcur = *L;while (pcur) {Node* temp = pcur;pcur = pcur->next;free(temp->data);free(temp);}*L = NULL;
}// 显示菜单
void show_screen() {printf("\n***************       功能选择     *****************\n");printf("*************** 1: 录入学生记录     ***************\n");printf("*************** 2: 添加学生记录     ***************\n");printf("*************** 3: 按学号删除记录   ***************\n");printf("*************** 4: 按学号修改记录   ***************\n");printf("*************** 5: 按姓名查找记录   ***************\n");printf("*************** 6: 显示所有记录     ***************\n");printf("*************** 7: 清屏             ***************\n");printf("*************** 8: 退出管理系统     ***************\n");
}int main() {Node* LinkStudent = NULL;InitList(&LinkStudent);while (1) {int choose;show_screen();printf("请选择:\n");scanf("%d", &choose);int c;while ((c = getchar()) != '\n' && c != EOF); // 清空scanf缓冲区switch (choose) {case 1: // 添加学生信息printf("请输入学生信息(学号 姓名 成绩),输入三次:\n");for (int i = 0; i < 3; i++) {Stu* s = (Stu*)malloc(sizeof(Stu));if (s == NULL) {perror("malloc failed!\n");exit(1);}scanf("%s%s%f", s->id, s->name, &s->score);Insert(&LinkStudent, s);}break;case 2: // 添加单条学生记录{Stu* s = (Stu*)malloc(sizeof(Stu));if (s == NULL) {perror("malloc failed!\n");exit(1);}printf("请输入学生信息(学号 姓名 成绩):\n");scanf("%s%s%f", s->id, s->name, &s->score);Insert(&LinkStudent, s);}break;case 3: // 按学号删除记录{char id[10];printf("请输入要删除的学号:");scanf("%s", id);Delete(&LinkStudent, id);}break;case 4: // 按学号修改记录{char id[10];printf("请输入要修改的学号:");scanf("%s", id);Change(&LinkStudent, id);}break;case 5: // 按姓名查找记录{char name[20];printf("请输入要查找的姓名:");scanf("%s", name);Node* result = SearchByName(LinkStudent, name);if (result) {printf("找到记录:学号:%s,姓名:%s,成绩:%.2f\n",result->data->id, result->data->name, result->data->score);}else {printf("未找到姓名为 %s 的记录!\n", name);}}break;case 6: // 显示所有记录DispList(LinkStudent);break;case 7: // 清屏system("cls");break;case 8: // 退出管理系统Destroy(&LinkStudent);printf("退出系统,拜拜!\n");return 0;default: // 输入错误printf("无效选项,请重新输入!\n");break;}}return 0;
}

6.总结:

小邓儿的本次学生信息管理系统,在插入、删除部分只用了一种方式,不是很完善,咱们可以用自行思考,看看怎么样加入其他方式,使得系统选择更多O(∩_∩)O

好了,今天的分享就到这里儿。别忘了点赞收藏😄😄😄

相关文章:

单链表的实现 | 附学生信息管理系统的实现

目录 1.前言&#xff1a; 2.单链表的相关概念&#xff1a; 2.1定义&#xff1a; 2.2形式&#xff1a; 2.3特点&#xff1a; 3.常见功能及代码 &#xff1a; 3.1创建节点&#xff1a; 3.2头插&#xff1a; 3.3尾插&#xff1a; 3.4头删&#xff1a; 3.5尾删&#xff1a; 3.6插入…...

【CMake】《CMake构建实战:项目开发卷》笔记-Chapter11-实践:基于onnxruntime的手写数字识别库

第11章 实践&#xff1a;基于onnxruntime的手写数字识别库 读者已经跟着本书实践了很多零零散散的实例&#xff0c;应该能够熟练使用CMake来构建C和C程序了吧&#xff01;不过&#xff0c;前面的实例往往都是针对某个特定功能编写的&#xff0c;我们可能很难将它们综合起来实…...

微软主要收入云计算,OFFICE,操作系统和游戏10大分类

微软2024年主要收入10大分类是哪些,再加一列赚钱比例 微软 2024 财年的财务数据可能尚未完全统计完成&#xff0c;且官方可能没有正好按 10 大分类公布主要收入情况。不过&#xff0c;依据微软过往的业务板块和常见的收入来源&#xff0c;下面是模拟的表格&#xff0c;赚钱比例…...

PDF预览-搜索并高亮文本

在PDF.js中实现搜索高亮功能可以通过自定义一些代码来实现。PDF.js 是一个通用的、基于Web的PDF阅读器&#xff0c;它允许你在网页上嵌入PDF文件&#xff0c;并提供基本的阅读功能。要实现搜索并高亮显示文本&#xff0c;你可以通过以下几个步骤来完成&#xff1a; 1. 引入PDF…...

随笔1 认识编译命令

1.认识编译命令 1.1 解释gcc编译命令: gcc test1.cpp -o test1 pkg-config --cflags --libs opencv 命令解析&#xff1a; gcc&#xff1a;GNU C/C 编译器&#xff0c;用于编译C/C代码。 test1.cpp&#xff1a;源代码文件。 -o test1&#xff1a;指定输出的可执行文件名为t…...

【谷歌设置】chrome打开页面在新tab设置(新版)

这里一定要在搜索之后点击账户&#xff0c;然后选择更过设置 选择在新窗口打开搜索结果...

9.翻页器组件设计开发与应用(Vue父子组件通信)

翻页器组件设计开发与使用 写在前面el-pagination分页器的用法用法介绍实战案例实现代码 Vue中的父子组件用法与通信何谓父子组件搭建Paginator.vue子组件组件初步搭建父组件向子组件传参通信子组件向父组件通信 最终代码Index.vuePaginator.vue 总结 欢迎加入Gerapy二次开发教…...

MyBatis-Flex关联查询

MyBatis-Flex关联查询 在 MyBatis-Flex 中&#xff0c;我们内置了 3 种方案&#xff0c;帮助用户进行关联查询&#xff0c;比如 一对多、一对一、多对一、多对多等场景&#xff0c;他们分别是&#xff1a; 方案1&#xff1a;Relations 注解方案2&#xff1a;Field Query方案3…...

Lucene.Net 分词器选择指南:盘古分词 vs 结巴分词

文章目录 前言一、核心特性对比二、典型场景推荐1. 选择盘古分词的场景2. 选择结巴分词的场景 三、关键指标实测对比1. 分词质量测试&#xff08;F1值&#xff09;2. 性能测试&#xff08;单线程&#xff09; 四、如何选择&#xff1f;决策树五、进阶优化建议1. 盘古分词优化方…...

YOLOv11实战电力设备缺陷检测

本文采用YOLOv11作为核心算法框架&#xff0c;结合PyQt5构建用户界面&#xff0c;使用Python3进行开发。YOLOv11以其高效的实时检测能力&#xff0c;在多个目标检测任务中展现出卓越性能。本研究针对电力设备缺陷数据集进行训练和优化&#xff0c;该数据集包含丰富的电力设备缺…...

LINUX 5 vim cat zip unzip

dd u撤销 ctrlr取消撤销 q!刚才的操作不做保存 刚才是编辑模式 现在是可视化模式 多行注释...

Redis的常见命令

Redis的常见命令 官方命令文档&#xff1a;https://redis.io/docs/latest/commands/ 文章目录 Redis的常见命令Redis数据结构介绍Redis通用命令1.String类型2.Hash类型3.List类型List类型的常见命令&#xff1a;利用List结构实现&#xff1a;栈、队列、阻塞队列&#xff1a; 4.…...

LeetCode第131题_分割回文串

LeetCode 第131题&#xff1a;分割回文串 题目描述 给你一个字符串 s&#xff0c;请你将 s 分割成一些子串&#xff0c;使每个子串都是 回文串 。返回 s 所有可能的分割方案。 回文串 是正着读和反着读都一样的字符串。 难度 中等 题目链接 点击在LeetCode中查看题目 示…...

网络钓鱼攻击的威胁和执法部门的作用(第一部分)

在当今的数字世界中&#xff0c;网络犯罪分子不断开发新技术来利用个人、企业和政府机构。 最普遍和最具破坏性的网络犯罪形式之一是网络钓鱼——一种社会工程手段&#xff0c;用于欺骗人们提供敏感信息&#xff0c;例如登录凭据、财务数据和个人详细信息。 随着网络钓鱼攻击…...

用Scala玩转Flink:从零构建实时处理系统

大家好&#xff01;欢迎来到 Flink 的奇妙世界&#xff01;如果你正对实时数据处理充满好奇&#xff0c;或者已经厌倦了传统批处理的漫长等待&#xff0c;那么你找对地方了。本系列文章将带你使用优雅的 Scala 语言&#xff0c;一步步掌握强大的流处理引擎——Apache Flink。 今…...

【LeetCode】算法详解#3 ---最大子数组和

1.题目介绍 给定一个整数数组 nums &#xff0c;请你找出一个具有最大和的连续子数组&#xff08;子数组最少包含一个元素&#xff09;&#xff0c;返回其最大和。 子数组是数组中的一个连续部分。 1 < nums.length < 105-104 < nums[i] < 104 2.解决思路 要求出…...

基于Python的心衰疾病数据可视化分析系统

【Python】基于Python的心衰疾病数据可视化分析系统 &#xff08;完整系统源码开发笔记详细部署教程&#xff09;✅ 目录 一、项目简介二、项目界面展示三、项目视频展示 一、项目简介 本项目基于Python开发&#xff0c;重点针对5000条心衰疾病患者的数据进行可视化分析&#…...

oracle批量删除分区

为了清理数据&#xff0c;往往需要删除一些分区 简单查看当前分区 附件 --创建测试表 -- drop table test_part purge;CREATE TABLE test_part (sales_id NUMBER,sale_date DATE,amount NUMBER ) PARTITION BY RANGE (sale_date) INTERVAL (INTERVAL 1 MONTH) -- 每个月创建…...

Android Compose入门和基本使用

文章目录 一、Jetpack Compose 介绍Jetpack Compose是什么Composable 函数命令式和声明式UI组合和继承 二、状态管理什么是状态Stateremember状态提升 三、自定义布局Layout ModifierLayout Composable固有特性测量使用内置组件固有特性测量自定义固有特性测量 四、项目中使用J…...

xLua的Lua调用C#的2,3,4

使用Lua在Unity中创建游戏对象&#xff0c;组件&#xff1a; 相关代码如下&#xff1a; Lua --Lua实例化类 --C# Npc objnew Npc() --通过调用构造函数创建对象 local objCS.Npc() obj.HP100 print(obj.HP) local obj1CS.Npc("admin") print(obj1.Name)--表方法希…...

使用 Python 连接 PostgreSQL 数据库,从 `mimic - III` 数据库中筛选数据并导出特定的数据图表

要使用 Python 连接 PostgreSQL 数据库&#xff0c;从 mimic - III 数据库中筛选数据并导出特定的数据图表&#xff0c;你可以按照以下步骤操作&#xff1a; 安装所需的库&#xff1a;psycopg2 用于连接 PostgreSQL 数据库&#xff0c;pandas 用于数据处理&#xff0c;matplot…...

算法刷题记录——LeetCode篇(2.6) [第151~160题](持续更新)

更新时间&#xff1a;2025-04-06 算法题解目录汇总&#xff1a;算法刷题记录——题解目录汇总技术博客总目录&#xff1a;计算机技术系列博客——目录页 优先整理热门100及面试150&#xff0c;不定期持续更新&#xff0c;欢迎关注&#xff01; 152. 乘积最大子数组 给你一个…...

Dijkstra求最短路径问题(优先队列优化模板java)

首先 1. 主类定义与全局变量 public class Main {static int N 100010; // 最大节点数static int INF Integer.MAX_VALUE; // 无穷大static ArrayList<Pair>[] G new ArrayList[N]; // 邻接表存储图static int[] dis new int[N]; // 存储每个节点的最短…...

【软件测试】性能测试 —— 基础概念篇

&#x1f970;&#x1f970;&#x1f970;来都来了&#xff0c;不妨点个关注叭&#xff01; &#x1f449;博客主页&#xff1a;欢迎各位大佬!&#x1f448; 本期内容主要介绍性能测试相关知识&#xff0c;首先我们需要了解性能测试是什么&#xff0c;本期内容主要介绍性能测试…...

Jmeter脚本使用要点记录

一&#xff0c;使用Bean shell获取请求响应的数据 byte[] result prev.getResponseData(); String str new String(result); System.out.println(str);其中&#xff0c;prev是jmeter的内置变量&#xff0c;直接使用即可。 二&#xff0c;不同的流程中传参数 vars.put(&quo…...

HTML5

HTML5是对HTML标准的第5次修订 HTML是超文本标记语言的简称&#xff0c;是为【网页创建和其它可在网页浏览器中所看到信息】而设计的一种标记性语言。 H5优点&#xff1a;跨平台使用将互联网语义化&#xff0c;更好地被人类与机器所理解降低了对浏览器的依赖&#xff0c;更好地…...

算法—博弈问题

1.博弈问题 1.前提:每一步都是最优解的情况下&#xff0c;先手的那个人已经确定了胜负 用dp数组记录每一步操作后的结果&#xff0c;如果下一步会出现必输结果&#xff0c;那么说明执行这步操作的人必胜&#xff0c;因为必输结果的下一步操作后都是必胜的结果&#xff0c;所以在…...

vector模拟实现(2)

1.构造函数 2.拷贝构造 我们利用push_back和reserve来实现拷贝构造。 3.迭代器的实现 由于底层是一段连续的空间&#xff0c;所以我们选择用指针来实现迭代器。 4.swap 这里的swap函数是有两种方法&#xff0c;一种是开辟一段新的空间&#xff0c;然后memcpy来把原来的数据拷…...

【嵌入式系统设计师】知识点:第3章 嵌入式硬件设计

提示:“软考通关秘籍” 专栏围绕软考展开,全面涵盖了如嵌入式系统设计师、数据库系统工程师、信息系统管理工程师等多个软考方向的知识点。从计算机体系结构、存储系统等基础知识,到程序语言概述、算法、数据库技术(包括关系数据库、非关系型数据库、SQL 语言、数据仓库等)…...

输入框输入数字且保持精度

在项目中如果涉及到金额等需要数字输入且保持精度的情况下&#xff0c;由于输入框是可以随意输入文本的&#xff0c;所以一般情况下可能需要监听输入框的change事件&#xff0c;然后通过正则表达式去替换掉不匹配的文本部分。 由于每次文本改变都会被监听&#xff0c;包括替换…...

Vue3中的Inject用法全解析

大家好呀&#xff5e;今天给大家带来一个超级实用的Vue3技巧&#xff1a;如何使用inject进行组件间的通信&#xff01;如果你对组件间的数据传递、事件触发感兴趣&#xff0c;那一定不要错过这篇文章哦&#xff01;话不多说&#xff0c;直接开整&#xff5e; &#x1f31f; 什么…...

FPGA同步复位、异步复位、异步复位同步释放仿真

FPGA同步复位、异步复位、异步复位同步释放仿真 xilinx VIVADO仿真 行为仿真 综合后功能仿真&#xff0c;综合后时序仿真 实现后功能仿真&#xff0c;实现后时序仿真 目录 前言 一、同步复位 二、异步复位 三、异步复位同步释放 总结 前言 本文将详细介绍FPGA同步复位、异…...

深度解析需求分析:理论、流程与实践

深度解析需求分析&#xff1a;理论、流程与实践 一、需求分析的目标&#xff08;一&#xff09;准确捕捉用户诉求&#xff08;二&#xff09;为开发提供清晰指引 二、需求分析流程&#xff08;一&#xff09;需求获取&#xff08;二&#xff09;需求整理&#xff08;三&#xf…...

QT学习笔记4--事件

1. 鼠标事件 1.1 鼠标按下 QObject中的mousePressEvent()方法 在子类中重写该方法&#xff0c;就可以处理鼠标按下 void myLabel::mousePressEvent(QMouseEvent *ev) {if (ev->button() Qt::LeftButton) {QString str QString("mouse press x %1, y %2").…...

AnimateCC基础教学:json数据结构的测试

一.核心代码: const user1String {"name": "张三", "age": 30, "gender": "男"}; const user1Obj JSON.parse(user1String); console.log("测试1:", user1Obj.name, user1Obj.age, user1Obj.gender);/*const u…...

针对Qwen-Agent框架的源码阅读与解析:FnCallAgent与ReActChat篇

在《针对Qwen-Agent框架的Function Call及ReAct的源码阅读与解析&#xff1a;Agent基类篇》中&#xff0c;我们已经了解了Agent基类的大体实现。这里我们就再详细学习一下FnCallAgent类和ReActChat的实现思路&#xff0c;从而对Agent的两条主流技术路径有更深刻的了解。同时&am…...

在docker中安装RocketMQ

第一步你需要有镜像包&#xff0c;这个2023年的时候docker就不能用pull拉取镜像了&#xff0c;需要你自己找 第二步我用的是FinalShell,用别的可视化界面也用&#xff0c; 在你自己平时放镜像包的地方创建一个叫rocketmq的文件夹&#xff0c;放入镜像包后&#xff0c;创建一个…...

Spring Boot + Kafka 消息队列从零到落地

背景 依赖 <dependency> <groupId>org.springframework.kafka</groupId> <artifactId>spring-kafka</artifactId> <version>2.8.1</version> </dependency> 发送消息 //示例&#xff1a; private final KafkaTemplate<St…...

《打破语言壁垒:bilingual_book_maker 让外文阅读更轻松》

在寻找心仪的外文电子书时&#xff0c;常常会因语言障碍而感到困扰。虽然可以将文本逐段复制到在线翻译工具中&#xff0c;但这一过程不仅繁琐&#xff0c;还会打断阅读的连贯性&#xff0c;让人难以沉浸其中。为了克服这一难题&#xff0c;我一直在寻找一种既能保留原文&#…...

JCR一区文章,壮丽细尾鹩莺算法Superb Fairy-wren Optimization-附Matlab免费代码

本文提出了一种新颖的基于群体智能的元启发式优化算法——壮丽细尾鹩优化算法&#xff08;SFOA&#xff09;,SFOA从精湛的神仙莺的生活习性中汲取灵感。融合了精湛的神仙莺群体中幼鸟的发育、繁殖后鸟类喂养幼鸟的行为以及它们躲避捕食者的策略。通过模拟幼鸟生长、繁殖和摄食阶…...

Kafka 如何实现 Exactly Once

Kafka 中实现 Exactly Once Semantics&#xff08;EOS&#xff0c;精确一次语义&#xff09;&#xff0c;是为了确保&#xff1a; 每条消息被处理一次且仅一次&#xff0c;既不会丢失&#xff0c;也不会重复消费。 这是一种在分布式消息系统中非常难实现的语义。Kafka 从 0.11 …...

在K8S中,内置的污点主要有哪些?

在Kubernetes (K8S)中&#xff0c;内置的污点&#xff08;Taints&#xff09;主要用于自动化的节点亲和性和反亲和性管理。当集群中的节点出现某种问题或满足特定条件时&#xff0c;kubelet会自动给这些节点添加内置污点。以下是一些常见的内置污点&#xff1a; node.kubernete…...

AI大模型:(二)2.1 从零训练自己的大模型概述

目录 1. 分词器训练 1.1 分词器概述 1.2 训练简述 2.预训练 2.1 预训练概述 2.2 预训练过程简介 3.微调训练 3.1 微调训练概述 3.2 微调过程简介 4.人类对齐 4.1 人类对齐概述 4.2 人类对齐训练过程简介 近年来,大语言模型(LLM)如GPT-4、Claude、LLaMA等…...

电动垂直起降飞行器(eVTOL)

电动垂直起降飞行器&#xff08;eVTOL&#xff09;的详细介绍&#xff0c;涵盖定义、技术路径、应用场景、市场前景及政策支持等核心内容&#xff1a; 一、定义与核心特性 eVTOL&#xff08;Electric Vertical Take-off and Landing&#xff09;即电动垂直起降飞行器&#xf…...

LM Studio本地部署大模型

现在的AI可谓是火的一塌糊涂, 看到使用LM Studio部署本地模型非常的方便, 于是我也想在自己的本地试试 LM Studio 简介 LM Studio 是一款专为本地运行大型语言模型&#xff08;LLMs&#xff09;设计的桌面应用程序&#xff0c;支持 Windows 和 macOS 系统。它允许用户在个人电…...

PyTorch 深度学习 || 6. Transformer | Ch6.1 Transformer 框架

1. Transformer 框架...

SLAM文献之-SLAMesh: Real-time LiDAR Simultaneous Localization and Meshing

SLAMesh 是一种基于 LiDAR 的实时同步定位与建图&#xff08;SLAM&#xff09;算法&#xff0c;其核心创新点在于将定位与稠密三维网格重建相结合&#xff0c;通过动态构建和优化多边形网格&#xff08;Mesh&#xff09;来实现高精度定位与环境建模。以下是其算法原理的详细解析…...

[Python] 位置相关的贪心算法-刷题+思路讲解版

位置贪心-题目目录 例题1 - 香蕉商人编程实现输入描述输出描述思路AC代码 例题2 - 分糖果编程实现输入描述输入样例输出样例思路AC代码 例题4 - 分糖果II编程实现输入描述输出描述输入样例思路AC代码 例题3 - 分糖果III编程实现输入描述输出描述输入样例输出样例思路AC代码 例题…...

练习题:125

目录 Python题目 题目 题目分析 需求理解 关键知识点 实现思路分析 代码实现 代码解释 导入 random 模块&#xff1a; 指定范围&#xff1a; 生成随机整数&#xff1a; 输出结果&#xff1a; 运行思路 结束语 Python题目 题目 生成一个指定范围内的随机整数。 …...

实战设计模式之迭代器模式

概述 与上一篇介绍的解释器模式一样&#xff0c;迭代器模式也是一种行为设计模式。它提供了一种方法来顺序访问一个聚合对象中的各个元素&#xff0c;而无需暴露该对象的内部表示。简而言之&#xff0c;迭代器模式允许我们遍历集合数据结构中的元素&#xff0c;而不必了解这些集…...