第二篇:数据结构与算法-链表
概念
链表是线性表的链式存储方式,逻辑上相邻的数据在计算机内的存储位置不必须相邻,可以给每个元素附加一个指针域,指向下一个元素的存储位 置。每个结点包含两个域:数据域和指针域,指针域存储下一个结点的地址,因此指针指向的类型也是 结点类型

结构体定义
Typedef struct LinkNode{ElemType data; //数据域struct LinkNode *next; //指针域}LinkList, LinkNode;//一个头结点和,其余节点
单向链表
链表的节点均单向指向下一个节点,形成一条单向访问的数据链 ,
只有需要插入的时候才需要申请的新的节点,删除是不需要新节点的,满足条件即可
链表:删除值,或者插入值,除非你的指针指向没有问题,否则不要直接使用头结点

初始化
typedef struct LinkList {
int elem; //数据域
struct LinkList* next; //指针域
}LinkList,LinkNode; //一个头结点,一个链条的节点
//初始化
bool initList(LinkList*& L) {
L = new LinkNode;
if (!L)return false;
L->next = NULL;
L->elem = 1;
return true;
}
前插法
bool insert_front(LinkList*& L, LinkNode*& node) {
if (!L || !node) {
return false;
}
node->next = L->next;
L->next = node;
return true;
}

尾插法:
bool insert_black(LinkList*& L, LinkNode*& node) {
if (!L || !node) {
return false;
}
LinkNode* p = NULL;
p = L;当前节点的下一个节点插入
while (p->next) {
p = p->next;
}
node->next = NULL;
p->next = node;
return true;
}

随意位置插入
bool insert_every(LinkList*& L, int pos, int e) {
if (!L)return false;LinkList* p;
LinkNode* s;//用这个节点来保存需要插入的值
int j = 0;
p = L;//插入是在这个节点之后插入,也就是实际值的前面插入
while (p&&j<pos-1) {
p = p->next;
j++;
}
if (!p||j>pos-1) {//判断循环退出之后,位置的合法性
return false;
}
s = new LinkNode;
s->elem = e;
s->next = p->next;
p->next = s;
return true;
}

输出指定位置的值
bool printIndex_Value(LinkList*& L, int pos, int& value) {
if (!L||!L->next) {
return false;
}
LinkList* p = NULL;
p = L->next;//代表实际值的第一个值,头结点是不算值的
int index = 1;
while (p&&index<pos) {
p = p->next;
index++;
}
if (!p || index > pos) {
return false;
}
value = p->elem;
return true;
}
//查找指定值是否存在并输出对应位置
bool printValue_Index(LinkList*& L, int value, int& index) {
if (!L||!L->next) {
return false;
}
LinkList* p = NULL;
p = L->next;
index = 1;
while (p&&p->elem!=value) {
p = p->next;
index++;
}
if (!p) {
return false;
}
return true;
}

删除指定位置的值
bool delete_value(LinkList*& L, int pos) {
if(!L||!L->next){
return false;
}
LinkList* p;
LinkNode* s;
p = L;//指向头结点,删除的节点为当前节点的下一个节点
int index = 1;
while (p->next && index<pos) {
p = p->next;
index++;
}if (!p->next||index>pos) {//判断n值的合法性
return false;
}
s = p->next;
p->next = s->next;
delete s;
return true;
}

摧毁表
void destoryLink(LinkList*& L) {
LinkList* p = L;
while (p) {
L = L->next;
cout << "删除元素" << p->elem << endl;
delete p;//这里删除p之后在进行p=p->next时不用L进行重新赋值就会出问题
p = L;}
}
 
单链表的遍历
void printLink(LinkList*& L){
if(!L)return false;//链表为空就没必要输出了
LinkNode *p;
p = L->next;//指向第一个实际的值
while (p){ //不为空的时候执行
cout<<p.elem<<" ";
p = p->next;
}
cout <<endl;
}
循环链表
解答约瑟夫问题 : 有 10 个小朋友按编号顺序 1,2,。。。,10 顺时针方向围成一圈。从 1 号开 始顺时针方向 1,2,。。。,9 报数, 凡报数 9 者出列 (显然,第一个出圈为编号 9 者)。最后一个 出圈者的编号是多少? 第 5 个 出圈者的编号是多少?

循环链表的初始化是要将,头结点的指针域指向自己
bool initList(LinkList *& L){
L = new LinkList;
if(!L) return false;
L .next = L; //头结点的指针域指向自己
L.elem = -1;//这个值没有实际作用
return false;
}
循环链表尾插法插入数据
bool insert_black(LinkList *&L ,LinkNode *&node){
if(!L||!node)//因为是插入值,所以需要判断当前节点和插入值的合法性
LinkNode * p = NULL;//定义一个节点,指向头结点
p = L;
while(p->next!=L){ //当p->next为L了,也就是到了实际值的最后一个了
p = p->next;
}
p->next = node;
node.next = L;
return true;
}
循环链表删除指定位置的数据
bool delete_index_value(LinkList *&L ,int pos){
if(!L||L == L->next)return false;//判断不为空链表
LinkNode *p;
LinkNode *s;
p = L;//指向头结点
int index = 0;//用来判断是否到达指定位置的上一个节点
while(p->next != L &&index<pos-1){
p = p->next;
}
s = p->next;
p->next = s->next;
retrun true;
}
循环链表的输出
void LinkPrint(LinkList *&L){
if(!L||L==L->next){
cout<<"这个链表是空的"<<endl;
return;
}
LinkNode *P ;
p = L->next;//因为需要输出值,先让节点指向第一个实际的值
while(p->next!=L){
cout<<p->elem<<" ";
p = p->next;
}
cout<<endl;
}
分析:解答约瑟夫问题
初始化头结点,
使用尾插法插入十个学生编号
循环判断,当数到9的时候,就删除这个编号的值
 
#include <iostream>
using namespace std;typedef struct LinkList {int data;struct LinkList* next;
}LinkList, LinkNode;
//初始化
bool initLink(LinkList*& L) {L = new LinkList;if (!L) {return false;}L->next = L;// L->data = -1;//这个节点实际是不计数的return true;
}
//添加元素,使用尾插法
bool insertLink(LinkList*& L, LinkNode* node) {LinkNode* p = NULL;if (!L && !node)return false;p = L;while (p->next != L) {p = p->next;}node->next = L;p->next = node;return true;
}
//遍历
void linkPrint(LinkList*& L) {LinkList* p = NULL;if (!L || L == L->next) {cout << "链表为空!" << endl;return;}p = L->next;//?while (p != L) {cout << p->data << " ";p = p->next;}cout << endl;
}
//循环删除
bool deleteLink(LinkList*& L, int interal) {LinkList* p;LinkList* q;int i = 0, j = 0;//j表示上一个,i表示这一个int times = 0, num = 0;p = L;if (!L || p->next == L) {//判断链表为空cout << "链表为空" << endl;return false;}if (interal < 1)return false;do {i += interal;//这一个的计数,每次相加都为9的倍数while (p->next){if (p->next != L)j++;//L这个节点是不能算数的,L节点只作为辅助节点if (j >= i) break;//当这里跳出的时候p还是上一次的值p->next指针,这一次还没有开始赋值p = p->next;}times++;//加一次算一轮q = p->next;//q就是要出圈的的指针num = q->data;//要出圈的那一个指针的值if (times == 5) {cout << "第五个出圈的是:" << num << endl;}cout << "出圈者: " << q->data << "出圈者的上一个: " << p->data<< "出圈者的下一个: " << q->next->data << endl;p->next = q->next;//要删除p,所以需要将p的指针复位delete q;//这里的q是一个临时节点,用来记录需要删除的节点,避免破坏循环链表的环linkPrint(L);} while (L->next != L);//这里是判断为空的时候,使用P->next !=L是不行的cout << "最后一个出圈的是:" << num << endl;return true;
}
int main(void) {LinkList* L;LinkNode* node;if (initLink(L)) {cout << "初始一个空的循环链表" << endl;}else {cout << "初始化失败" << endl;}int i = 0;while ((++i) <= 10) {node = new LinkNode;node->data = i;node->next = NULL;if (insertLink(L, node)) {cout << "插入成功" << endl;}else {cout << "插入失败" << endl;}}linkPrint(L);////Joseph(L, 9);deleteLink(L, 9);return 0;
} 
双向链表
单链表中每个结点除了存储自身数据之后,还存储了下一个结点的地址,因此可以轻松访问
下一个结点,以及后面的后继结点,但是如果想访问前面的结点就不行了,可以在单链表的基础上给每个元素附加 两个指针域,一个存储前一个元素的地址,一个存储下一个元素的地址。 这种链表称为双向链表

双向链表结构体和初始化
typedef struct LinkList {
int data;
struct LinkList* pre;
struct LinkList* next;
}LinkList, LinkNode;
bool initList(LinkList*& L) {
L = new LinkList;
if (!L)return false;
cout << "初始化成功" << endl;
L->next = NULL;
L->pre = NULL;
L->data = -1;
return true;
}
 
双向链表前插法:
bool insert_front(LinkList*& L, LinkNode*& node) {
if (!L||!node) {
return false;
}
LinkNode* p;//建立一个新节点,用来指向头节点
p = L;
if (!p->next) {//当只有一个头结点时
p->next = node;
node->next = NULL;
node->pre = p;
return true;
}
p->next->pre = node;
node->next = p->next;
p->next = node;
node->pre = p;
return true;
}
双向链表后插法:
bool insert_black(LinkList*& L, LinkNode*& node) {
if (!L||!node) {
return false;
}
LinkNode* p;
p = L;
while (p->next) {
p = p->next;
}
node->next = NULL;
p->next = node;
node->pre = p;
return true;
}
双向链表删除指定节点
bool delete_index_value(LinkList*& L, int pos) {
if (!L) {
return false;
}
LinkList* p;
p = L->next;
int index = 0;
while (p&&index<pos-1) {
p = p->next;
index++;
}
if (!p || index>pos) {//判断需要删除值的合法性
return false;
}
if (!p->next) {
p->pre->next = NULL;
delete p;
return true;
}
p->pre->next = p->next;//此时的p是需要删除的节点,所以需要将他的前一个节点的下一个位置,指向p的下一个位置
p->next->pre = p->pre;//p的下一个位置的前一个节点就是,需要删除的节点p的前一个节点;
delete p;
return true;
}
双向链表输出指定位置的值
bool print_index_value(LinkList*& L, int pos, int& value) {
if (!L) {
return false;
}
LinkNode* p;
p = L->next;
int index = 0;
while (p&&index<pos-1) {
p = p->next;
index++;
}
value = p->data;
return true;
}
双向链表在任意位置插入值
//在随意位置插入
bool insert_every(LinkList*& L, int pos, int& value) {
if (!L) {
return false;
}
LinkNode* p;
LinkNode* s;
p = L;
int index = 0;
while (p->next&&index <pos-1) {
p = p->next;
index++;
}
s = new LinkNode;
s->data = value;
p->next->pre = s;
s->next = p->next;
p->next = s;
s->pre = p;
return true;
}
双向链表遍历:
void printLink(LinkList*& L) {
if (!L) {
cout << "链表为空" << endl;
return;
}
LinkNode* p;
p = L;
cout << endl;
cout << "顺序输出: ";
while (p->next) {
cout << p->next->data << " ";
p = p->next;
}
cout << endl;
cout << "逆向输出: ";
while (p->pre) {
cout << p->data<< " ";
p = p->pre;
}
}

#include <iostream>
using namespace std;
typedef struct LinkList {int data;struct LinkList* pre;struct LinkList* next;
}LinkList, LinkNode;
bool initList(LinkList*& L) {L = new LinkList;if (!L)return false;cout << "初始化成功" << endl;L->next = NULL;L->pre = NULL;L->data = -1;return true;
}
//前插法
bool insert_front(LinkList*& L, LinkNode*& node) {if (!L||!node) {return false;}LinkNode* p;//建立一个新节点,用来指向头节点p = L;if (!p->next) {//当只有一个头结点时p->next = node;node->next = NULL;node->pre = p;return true;}p->next->pre = node;node->next = p->next;p->next = node;node->pre = p;return true;
}
//后插法
bool insert_black(LinkList*& L, LinkNode*& node) {if (!L||!node) {return false;}LinkNode* p;p = L;while (p->next) {p = p->next;}node->next = NULL;p->next = node;node->pre = p;return true;
}
//遍历
void printLink(LinkList*& L) {if (!L) {cout << "链表为空" << endl;return;}LinkNode* p;p = L;cout << endl;cout << "顺序输出: ";while (p->next) {cout << p->next->data << " ";p = p->next;}cout << endl;cout << "逆向输出: ";while (p->pre) {cout << p->data<< " ";p = p->pre;}
}
//在随意位置插入
bool insert_every(LinkList*& L, int pos, int& value) {if (!L) {return false;}LinkNode* p;LinkNode* s;p = L;int index = 0;while (p->next&&index <pos-1) {p = p->next;index++;}s = new LinkNode;s->data = value;p->next->pre = s;s->next = p->next;p->next = s;s->pre = p;return true;
}
//输出随意位置的值
bool print_index_value(LinkList*& L, int pos, int& value) {if (!L) {return false;}LinkNode* p;p = L->next;int index = 0;while (p&&index<pos-1) {p = p->next;index++;}value = p->data;return true;
}
//删除指定节点的值
bool delete_index_value(LinkList*& L, int pos) {if (!L) {return false;}LinkList* p;p = L->next;int index = 0;while (p&&index<pos-1) {p = p->next;index++;}if (!p || index>pos) {//判断需要删除值的合法性return false;}if (!p->next) {p->pre->next = NULL;delete p;return true;}p->pre->next = p->next;//此时的p是需要删除的节点,所以需要将他的前一个节点的下一个位置,指向p的下一个位置p->next->pre = p->pre;//p的下一个位置的前一个节点就是,需要删除的节点p的前一个节点;delete p;return true;
}
int main(void) {LinkList* L;LinkNode* node;//初始化initList(L);/*cout << "使用前插法: " << endl;for (int i = 0; i < 10; i++) {node = new LinkNode;node->data = i;node->next = NULL;node->pre = NULL;insert_front(L, node);}printLink(L);*/cout << endl;cout << "使用尾插法: " << endl;for (int i = 0; i < 10; i++) {node = new LinkNode;node->data = i;node->next = NULL;node->pre = NULL;insert_black(L, node);}printLink(L);int pos,value;cout << endl;cout << "请输入需要插入的位置和值";cin >> pos >> value;if (insert_every(L,pos,value)) {cout << "插入成功" << endl;printLink(L);}else {cout << "插入失败" << endl;printLink(L);}cout << endl;int pos1, value1=0;cout << "请输入你需要查找的位置";cin >> pos1;if (print_index_value(L,pos1,value1)) {cout << "位置" << pos1 << "的值是: " << value1 << endl;}//删除指定节点cout << "请输入你需要删除的位置";int pos2;cin >> pos2;if (delete_index_value(L,pos2)) {cout << "删除成功" << endl;printLink(L);}else {cout << "删除失败" << endl;}} 
共享链表

#include <iostream>
using namespace std;typedef struct DoubleLink {struct DoubleLink* pre;struct DoubleLink* next;
}LinkList ,LinkNode;
typedef struct {int elem;LinkNode node;
}DoubleTime;
typedef struct {char elem;int i;LinkNode node1;
}struct1;
//初始化链表
bool initLink(LinkList& L) {//因为node在结构体申请新空间的时候就已经被初始化了L.next = NULL;L.pre = NULL;return true;
}
//后插法
bool insert_black(LinkList& L, LinkNode& node) {LinkList* p = NULL;p = &L;while (p->next) {p = p->next;}p->next = &node;node.pre = p;node.next = NULL;return true;
}
int main(void) {DoubleTime* d = new DoubleTime;DoubleTime* node = NULL;initLink(d->node);d->elem = -1;cout << "请输入需要插入的个数: ";;int n;cin >> n;while (n>0) {node = new DoubleTime;node->elem = n;cout << "值是: " << node->elem << "地址值: " << &node->elem << endl;insert_black(d->node, node->node);n--;}//使用链表遍历元素int offset = offsetof(DoubleTime, node);//计算偏移量LinkList* p;p = &(d->node);while (p->next) {p = p->next;DoubleTime* tmp = (DoubleTime*)((size_t)p - offset);cout << "值是: " << tmp->elem << "地址值是: " << p << endl;}while (p) {DoubleTime* tmp1 = (DoubleTime*)((size_t)p - offset);cout << "删除的值是: " << tmp1->elem << "地址值是: " << p << endl;p = p->pre;delete tmp1;}return 0;}相关文章:
第二篇:数据结构与算法-链表
概念 链表是线性表的链式存储方式,逻辑上相邻的数据在计算机内的存储位置不必须相邻, 可以给每个元素附加一个指针域,指向下一个元素的存储位 置。 每个结点包含两个域:数据域和指针域,指针域存储下一个结点的地址&…...
低代码配置-小程序配置
数据结构 {"data": {"layout": {"api":{"pageApi":{//api详情}},"config":{"title":"页面标题",},"listLayout": {"fields": [{"componentCode": "grid…...
第十八讲_HarmonyOS应用开发实战(实现电商首页)
HarmonyOS应用开发实战(实现电商首页) 1. 项目涉及知识点罗列2. 项目目录结构介绍3. 最终的效果图4. 部分源码展示 1. 项目涉及知识点罗列 掌握HUAWEI DevEco Studio开发工具掌握创建HarmonyOS应用工程掌握ArkUI自定义组件掌握Entry、Component、Builde…...
OJAC近屿智能张立赛博士揭秘GPT Store:技术创新、商业模式与未来趋势
Look!👀我们的大模型商业化落地产品📖更多AI资讯请👉🏾关注Free三天集训营助教在线为您火热答疑👩🏼🏫 亲爱的伙伴们: 1月31日晚上8:30,由哈尔滨工业大学的…...
Java接收curl发出的中文请求无法解析
最近做项目遇到了这种情况,Java接收curl发出的中文请求无法解析,英文请求一切正常,中文请求则对方服务器无法解析,可以猜测是中文导致的编码问题,但是奇怪的是,本地输出json也没有乱码,编解码正…...
Java设计模式-外观模式(11)
大家好,我是馆长!今天开始我们讲的是结构型模式中的外观模式。老规矩,讲解之前再次熟悉下结构型模式包含:代理模式、适配器模式、桥接模式、装饰器模式、外观模式、享元模式、组合模式,共7种设计模式。。 外观模式(Decorator Pattern) 定义 外观(Facade)模式一种通…...
HCS-华为云Stack-FusionSphere
HCS-华为云Stack-FusionSphere FusionSphere是华为面向多行业客户推出的云操作系统解决方案。 FusionSphere基于开放的OpenStack架构,并针对企业云计算数据中心场景进行设计和优化,提供了强大的虚拟化功能和资源池管理能力、丰富的云基础服务组件和工具…...
C++类模板实现顺序表SeqList
main函数 #include<iostream> #include<stdlib.h> #include"SeqList.cpp"using namespace std;typedef int ElementType; int main(void) {SeqList< ElementType, 10> SeqList(1);cout << SeqList.ListLength() << endl;bool result;…...
sklearn 学习-混淆矩阵 Confusion matrix
混淆矩阵Confusion matrix:也称为误差矩阵,通过计算得出矩阵的结果用来表示分类器的精度。其每一列代表预测值,每一行代表的是实际的类别。 from sklearn.metrics import confusion_matrixy_true [2, 0, 2, 2, 0, 1] y_pred [0, 0, 2, 2, 0…...
C#,数据检索算法之跳跃搜索(Jump Search)的源代码
数据检索算法是指从数据集合(数组、表、哈希表等)中检索指定的数据项。 数据检索算法是所有算法的基础算法之一。 本文提供跳跃搜索的源代码。 1 文本格式 using System; namespace Legalsoft.Truffer.Algorithm { public static class ArraySe…...
ElasticSearch 开发总结(九)——SearchType:DFS_QUERY_THEN_FETCH和QUERY_THEN_FETCH
ElasticSearch 开发总结(九)——SearchType:DFS_QUERY_THEN_FETCH和QUERY_THEN_FETCH-CSDN博客 1.SearchType ES的搜索类型 有一个类SearchType(如下图示),关于该类的描述: Search type repre…...
那些年与指针的爱恨情仇(一)---- 指针本质及其相关性质用法
关注小庄 顿顿解馋 (≧∇≦) 引言: 小伙伴们在学习c语言过程中是否因为指针而困扰,指针简直就像是小说女主,它逃咱追,我们插翅难飞…本篇文章让博主为你打理打理指针这个傲娇鬼吧~ 本节我们将认识到指针本质,何为指针和…...
计算机网络——TCP协议
💡TCP的可靠不在于它是否可以把数据100%传输过去,而是 1.发送方发去数据后,可以知道接收方是否收到数据;2.如果接收方没收到,可以有补救手段; 图1.TCP组成图 TCP的可靠性是付出代价的,即传输效率…...
软考高级有意义吗?
有同学在平台向我提问,软考高级好像不好通过,花那么多时间去准备(非科班),有意义么? 我知道有些同学还在犹豫,不确定是否要报名软考系统架构设计师或者系统分析师。我认为,这种犹豫…...
二分算法模版
二分算法模版 实数二分算法模版实数二分模版题 整数二分算法模版向上取整二分模版向下取整二分模版二分模版的注意点二分模版中check函数的实现能够使用二分的条件 二分主要分两类, 一类是对实数进行二分,一类是对整数进行二分 对整数二分又分成2种&…...
【CSS】字体效果展示
测试时使用了Google浏览器。 1.Courier New 2.monospace 3.Franklin Gothic Medium 4.Arial Narrow 5.Arial 6.sans-serif 7.Gill Sans MT 8.Calibri 9.Trebuchet MS 10.Lucida Sans 11.Lucida Grande 12.Lucida Sans Unicode 13.Geneva 14.Verdana 15.Segoe UI 16.Tahoma 17.…...
asp.net宠物流浪救助系统
asp.net宠物流浪救助系统 当领养人是无或者未领养的时候,就会显示领养申请按钮,登陆的用户可以申请领域该宠物,未登录会提示登陆然后转到登陆页面 宠物领养页面支持关键字查询符合条件的宠物 当有领养人时就隐藏领养申请按钮 社区交流意见…...
git常见命令
1、常用命令记录 1)切换分支 git checkout 分支名2)查看分支 查看远程分支 git branch -r 查看所有分支包括本地分支和远程分支 git branch -a3)合并分支 git merge 来源分支4)删除分支 删除本地分支:git branch …...
主成分分析(PCA)Python
实际问题研究中,常常遇到多变量问题,变量越多,问题往往越复杂,且各个变量之间往往有联系。于是,我们想到能不能用较少的新变量代替原本较多的旧变量,且使这些较少的新变量尽可能多地保留原来变量所反映的信…...
Leetcode—144. 二叉树的前序遍历【简单】
2023每日刷题(九十六) Leetcode—144. 二叉树的前序遍历 实现代码 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr…...
MFC内存泄露
1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...
IGP(Interior Gateway Protocol,内部网关协议)
IGP(Interior Gateway Protocol,内部网关协议) 是一种用于在一个自治系统(AS)内部传递路由信息的路由协议,主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...
AtCoder 第409场初级竞赛 A~E题解
A Conflict 【题目链接】 原题链接:A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串,只有在同时为 o 时输出 Yes 并结束程序,否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...
Python爬虫实战:研究feedparser库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...
对WWDC 2025 Keynote 内容的预测
借助我们以往对苹果公司发展路径的深入研究经验,以及大语言模型的分析能力,我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际,我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测,聊作存档。等到明…...
Spring AI 入门:Java 开发者的生成式 AI 实践之路
一、Spring AI 简介 在人工智能技术快速迭代的今天,Spring AI 作为 Spring 生态系统的新生力量,正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务(如 OpenAI、Anthropic)的无缝对接&…...
【JavaSE】绘图与事件入门学习笔记
-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角,以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。 坐标体系-像素 …...
【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统
目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索(基于物理空间 广播范围)2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...
GC1808高性能24位立体声音频ADC芯片解析
1. 芯片概述 GC1808是一款24位立体声音频模数转换器(ADC),支持8kHz~96kHz采样率,集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器,适用于高保真音频采集场景。 2. 核心特性 高精度:24位分辨率,…...
代码随想录刷题day30
1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...

