学习笔记---0基础+干货满满的单链表专题~~


目录​​​​​​​

1. 链表的概念及结构👑

1.1 什么是链表?👀

1.2 为什么需要链表?⁉️

1.3 链表的结构是怎么样的?❓

2. 链表的分类🦜

3. 实现单链表🫵

3.1 要实现的目标🎯

3.2 创建+打印🐤

3.2.1 SList.h

3.2.2 SList.c

3.2.3 test.c

3.2.4 代码运行测试​​​​​​​​​​​​​​

3.3 尾插🍕

3.3.0 尾插思路分析​​​​​​​

3.3.1 SList.h

3.3.2 SList.c

3.3.3 test.c

3.3.4 代码运行测试

3.4 头插🍤

3.4.0 头插思路分析

3.4.1 SList.h

3.4.2 SList.c

3.4.3 test.c

3.4.4 代码运行测试

3.5 尾删🍮

3.5.0 尾删思路分析

3.5.1 SList.h

3.5.2 SList.c

3.5.3 test.c

3.5.4 代码运行测

3.6 头删🥃

3.6.0 头删思路分析

3.6.1 SList.h

3.6.2 SList.c

3.6.3 test.c

3.6.4 代码运行测试

3.7 指定节点之前/之后插入节点+查找指定位置的数据🥎

3.7.0 指定节点之前/之后插入节点思路分析

3.7.1 SList.h

3.7.2 SList.c

3.7.3 test.c

3.7.4 代码运行测试

3.8 删除pos节点or pos节点之后的节点🏓

 3.8.0 删除pos节点or pos节点之后的节点思路分析

3.8.1 SList.h

3.8.2 SList.c

3.8.3 test.c

3.8.4 代码运行测试

3.9 销毁🌔

3.9.0 销毁思路分析

3.9.1 SList.h

3.9.2 SList.c

3.9.3 test.c

3.9.4 代码运行测试


1. 链表的概念及结构👑

1.1 什么是链表?👀

通过顺序表的学习,我们对线性表和顺序表有了一定的了解🫡

其实,链表也是线性表的一种,链表逻辑连续物理不连续地址不连续,这一点是和顺序表不同的

为了方便大家具像化理解,我们以火车车厢🚄举例:


我们发现:车厢(独立的---可以任意增加or减少but不影响其他车厢)是(逻辑上)连续的排列的,但是车厢编号(物理上)不一定连续排列

假设每节⻋厢的⻋⻔都是锁上的状态,需要不同的钥匙才能解锁,每次只能携带⼀把钥匙的情况下如何从⻋头⾛到⻋尾?

最简单的做法:每节⻋厢⾥都放⼀把下⼀节⻋厢的钥匙。

那么,链表(我们这里特指单链表)中的“车厢”是怎样的呢?


与顺序表不同的是,链表⾥的每节"⻋厢"都是独⽴申请的空间(可能连续,也可能不连续),我们称之为“结点/节点

节点的组成主要有两个部分:当前节点要保存的数据和保存下⼀个节点的地址(指针变量)

注意⚠️

我们这里特指的是单链表,所以如图所示,当到尾节点的时候,尾节点后面没有节点了,所以地址为空,即指向NULL


1.2 为什么需要链表?⁉️

我们在顺序表的应用那一篇博客提及到了顺序表的思考🤔

1.链表申请的空间都是独立的,需要几个我们就申请几个,不会造成浪费或者申请空间不够

2.拷贝数据的时候,也不需要释放旧空间

3.中间/头部的插入删除,只需要修改指针的指向,效率较高

............

1.3 链表的结构是怎么样的?❓

结合前⾯学到的结构体知识,我们可以给出每个节点对应的结构体代码:

假设当前保存的节点为整型:

struct SListNode
{int data; //节点数据struct SListNode* next; //指针变量⽤保存下⼀个节点的地址
};

2. 链表的分类🦜


1.单向:一个方向---向后链接

2.双向:两个方向---前后都可以链接(我们下下期会讲)

3.带头:类似于哨兵位,不保存有效数据,只是标识一个头(哨兵位不能为空,也不能改变)

4.不带头:没有哨兵位,第一个节点保存有效数据和下一个节点的地址(为了方便,我们下面在实现单链表的时候会把第一个节点直接叫作“头节点”,但是和哨兵位所指代的头节点不一样)

5.循环:尾节点不指向NULL,而是指向头节点(带头)or第一个节点(不带头)的地址,使头尾相连--->循环♻️

6.不循环:尾节点指向NULL

链表的结构⾮常多样,以下情况组合起来就有8种(2 x 2 x 2)链表结构:


但是,这么多种链表,我们最常用的是单向不带头不循环链表(我们接下来简称单链表)和双向带头循环链表(我们下下期讲的时候简称双链表)

3. 实现单链表🫵

3.1 要实现的目标🎯

和顺序表一样,我们需要源文件和头文件来实现,也需要实现多个接口,方便使用(也可以为下期的单链表实现通讯录做准备)

我们需要多个接口帮助我们实现:创建、一系列具体操作、销毁

具体操作(一切以实现通讯录为目标)包括:头部/尾部插入数据、头部/尾部删除数据、打印出单链表、指定节点之后/之前插入节点、删除指定节点之后的节点、查找指定节点

3.2 创建+打印🐤

3.2.1 SList.h

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>
#include<string.h>//定义单链表节点的结构体(创建)
typedef int SLDataType;
typedef struct SListNode
{SLDataType data;//要保存的数据struct SListNode* next;//存储下一个节点的地址
}SlNode;//打印
void SLPrint(SLNode* phead);

3.2.2 SList.c

#include"SList.h"
//打印
void SLPrint(SlNode* phead)
{//循环打印SlNode* pcur = phead;//pcur从头节点开始遍历链表//不用phead遍历--->以后需要用到指向头节点的地址时,帮助我找到地址while (pcur)//pcur指向NULL的时候结束遍历{printf("%d->", pcur->data);pcur = pcur->next;//pcur指向下一个节点继续遍历}printf("NULL\n");
}

3.2.3 test.c

#include"SList.h"
void SLTest()
{//创建节点--->申请空间//存储有效数据SlNode* node1 = (SlNode*)malloc(sizeof(SlNode));node1->data = 1;SlNode* node2 = (SlNode*)malloc(sizeof(SlNode));node2->data = 2;SlNode* node3 = (SlNode*)malloc(sizeof(SlNode));node3->data = 3;SlNode* node4 = (SlNode*)malloc(sizeof(SlNode));node4->data = 4;SlNode* node5 = (SlNode*)malloc(sizeof(SlNode));node5->data = 5;//存储下一个节点的地址node1->next = node2;node2->next = node3;node3->next = node4;node4->next = node5;node5->next = NULL;//单向不带头不循环链表//打印SlNode* plist = node1;SLPrint(plist);
}
int main()
{SLTest();return 0;
}

3.2.4 代码运行测试​​​​​​​​​​​​​​


3.3 尾插🍕

3.3.0 尾插思路分析​​​​​​​


3.3.1 SList.h

//尾插
void SLPushBack(SlNode** pphead, SLDataType x);//一级指针要二级指针接受才可以改变形参

3.3.2 SList.c

//插入数据都需要创建空间--->我们单独写出来,避免重复多次
SlNode* SLBuyNNode(SLDataType x)
{SlNode* node = (SlNode*)malloc(sizeof(SlNode));if (node == NULL){perror("malloc");return 1;}node->data = x;node->next = NULL;return node;
}
//尾插
void SLPushBack(SlNode** pphead, SLDataType x)//一级指针要二级指针接受才可以改变
{//传过来的指针不能为空assert(pphead);SlNode* node = SLBuyNNode(x);//链表为空,直接插入if (*pphead == NULL){*pphead = node;return 1;}//到这说明不为空,遍历SlNode* pcur = *pphead;while (pcur->next){pcur = pcur->next;}pcur->next = node;
}

3.3.3 test.c

#include"SList.h"
void SLTest()
{//创建节点--->申请空间//存储有效数据SlNode* node1 = (SlNode*)malloc(sizeof(SlNode));node1->data = 1;SlNode* node2 = (SlNode*)malloc(sizeof(SlNode));node2->data = 2;SlNode* node3 = (SlNode*)malloc(sizeof(SlNode));node3->data = 3;SlNode* node4 = (SlNode*)malloc(sizeof(SlNode));node4->data = 4;SlNode* node5 = (SlNode*)malloc(sizeof(SlNode));node5->data = 5;//存储下一个节点的地址node1->next = node2;node2->next = node3;node3->next = node4;node4->next = node5;node5->next = NULL;//单向不带头不循环链表//打印SlNode* plist = node1;SLPrint(plist);
}
void SLTest01()
{SlNode* plist = NULL;//尾插SLPushBack(&plist, 1);SLPushBack(&plist, 2);SLPushBack(&plist, 3);SLPushBack(&plist, 4);SLPrint(plist);
}
int main()
{SLTest();SLTest01();return 0;
}

3.3.4 代码运行测试


3.4 头插🍤

3.4.0 头插思路分析


3.4.1 SList.h

//头插
void SLPushFront(SlNode** pphead, SLDataType x);//一级指针要二级指针接受才可以改变形参

3.4.2 SList.c

//头插
void SLPushFront(SlNode** pphead, SLDataType x)//一级指针要二级指针接受才可以改变形参
{//传过来的指针不能为空assert(pphead);SlNode* node = SLBuyNNode(x);//新节点和原来的头节点链接node->next = *pphead;//新节点成为新的头节点*pphead = node;
}

3.4.3 test.c

#include"SList.h"
void SLTest()
{//创建节点--->申请空间//存储有效数据SlNode* node1 = (SlNode*)malloc(sizeof(SlNode));node1->data = 1;SlNode* node2 = (SlNode*)malloc(sizeof(SlNode));node2->data = 2;SlNode* node3 = (SlNode*)malloc(sizeof(SlNode));node3->data = 3;SlNode* node4 = (SlNode*)malloc(sizeof(SlNode));node4->data = 4;SlNode* node5 = (SlNode*)malloc(sizeof(SlNode));node5->data = 5;//存储下一个节点的地址node1->next = node2;node2->next = node3;node3->next = node4;node4->next = node5;node5->next = NULL;//单向不带头不循环链表//打印SlNode* plist = node1;SLPrint(plist);
}
void SLTest01()
{SlNode* plist = NULL;//尾插SLPushBack(&plist, 1);SLPushBack(&plist, 2);SLPushBack(&plist, 3);SLPushBack(&plist, 4);SLPrint(plist);//头插SLPushFront(&plist, 5);SLPrint(plist);
}
int main()
{SLTest();SLTest01();return 0;
}

3.4.4 代码运行测试


3.5 尾删🍮

3.5.0 尾删思路分析


​​​​​​​


3.5.1 SList.h

//尾删
void SLPopBack(SlNode** pphead);

3.5.2 SList.c

///尾删
void SLPopBack(SlNode** pphead)
{assert(pphead&&*pphead);//只有1个节点if ((*pphead)->next == NULL){free(*pphead);*pphead = NULL;}//多个节点else{SlNode* prev = NULL;SlNode* ptail = *pphead;while (prev->next != NULL){prev = ptail;ptail = ptail->next;}prev->next = ptail->next;free(ptail);ptail = NULL;}
}

3.5.3 test.c

#include"SList.h"
void SLTest()
{//创建节点--->申请空间//存储有效数据SlNode* node1 = (SlNode*)malloc(sizeof(SlNode));node1->data = 1;SlNode* node2 = (SlNode*)malloc(sizeof(SlNode));node2->data = 2;SlNode* node3 = (SlNode*)malloc(sizeof(SlNode));node3->data = 3;SlNode* node4 = (SlNode*)malloc(sizeof(SlNode));node4->data = 4;SlNode* node5 = (SlNode*)malloc(sizeof(SlNode));node5->data = 5;//存储下一个节点的地址node1->next = node2;node2->next = node3;node3->next = node4;node4->next = node5;node5->next = NULL;//单向不带头不循环链表//打印SlNode* plist = node1;SLPrint(plist);
}
void SLTest01()
{SlNode* plist = NULL;//尾插SLPushBack(&plist, 1);SLPushBack(&plist, 2);SLPushBack(&plist, 3);SLPushBack(&plist, 4);SLPrint(plist);//头插SLPushFront(&plist, 5);SLPrint(plist);//尾删SLPopBack(&plist);SLPrint(plist);
}
int main()
{SLTest();SLTest01();return 0;
}

3.5.4 代码运行测


3.6 头删🥃

3.6.0 头删思路分析


3.6.1 SList.h

//头删
void SLPopFront(SlNode** pphead);

3.6.2 SList.c

//头删
void SLPopFront(SlNode** pphead)
{assert(pphead&&*pphead);SlNode* del = *pphead;*pphead = (*pphead)->next;free(del);del = NULL;
}

3.6.3 test.c

#include"SList.h"
void SLTest()
{//创建节点--->申请空间//存储有效数据SlNode* node1 = (SlNode*)malloc(sizeof(SlNode));node1->data = 1;SlNode* node2 = (SlNode*)malloc(sizeof(SlNode));node2->data = 2;SlNode* node3 = (SlNode*)malloc(sizeof(SlNode));node3->data = 3;SlNode* node4 = (SlNode*)malloc(sizeof(SlNode));node4->data = 4;SlNode* node5 = (SlNode*)malloc(sizeof(SlNode));node5->data = 5;//存储下一个节点的地址node1->next = node2;node2->next = node3;node3->next = node4;node4->next = node5;node5->next = NULL;//单向不带头不循环链表//打印SlNode* plist = node1;SLPrint(plist);
}
void SLTest01()
{SlNode* plist = NULL;//尾插SLPushBack(&plist, 1);SLPushBack(&plist, 2);SLPushBack(&plist, 3);SLPushBack(&plist, 4);SLPrint(plist);//头插SLPushFront(&plist, 5);SLPrint(plist);//尾删SLPopBack(&plist);SLPrint(plist);//头删SLPopFront(&plist);SLPrint(plist);
}
int main()
{SLTest();SLTest01();return 0;
}

3.6.4 代码运行测试


3.7 指定节点之前/之后插入节点+查找指定位置的数据🥎

3.7.0 指定节点之前/之后插入节点思路分析



3.7.1 SList.h

//查找数据
SlNode* SLFind(SlNode** pphead, SLDataType x);//指定位置之前插入
void SLInsert(SlNode** pphead,SlNode* pos, SLDataType x);//指定位置之后插入
void SLInsertAfter(SlNode* pos, SLDataType x);

3.7.2 SList.c

//查找数据
SlNode* SLFind(SlNode** pphead, SLDataType x)
{assert(pphead);SlNode* pcur = *pphead;while (pcur){if (pcur->data == x){return pcur;}pcur = pcur->next;}return NULL;
}//指定位置之前插入
void SLInsert(SlNode** pphead, SlNode* pos, SLDataType x)
{assert(pphead && *pphead&&pos);//创建空间SlNode* node = SLBuyNode(x);//pos为第一个节点(只有1个节点)if (pos == (*pphead)){node->next = *pphead;*pphead = node;return 1;}//pos不为第一个节点//找pos节点的前一个节点SlNode* prev = *pphead;while (prev->next != pos){prev = prev->next;}node->next = pos;prev->next = node;
}
//指定位置之后插入
void SLInsertAfter(SlNode* pos, SLDataType x)
{assert(pos);//创建空间SlNode* node = SLBuyNNode(x);node->next = pos->next;pos->next = node;
}

3.7.3 test.c

#include"SList.h"
void SLTest()
{//创建节点--->申请空间//存储有效数据SlNode* node1 = (SlNode*)malloc(sizeof(SlNode));node1->data = 1;SlNode* node2 = (SlNode*)malloc(sizeof(SlNode));node2->data = 2;SlNode* node3 = (SlNode*)malloc(sizeof(SlNode));node3->data = 3;SlNode* node4 = (SlNode*)malloc(sizeof(SlNode));node4->data = 4;SlNode* node5 = (SlNode*)malloc(sizeof(SlNode));node5->data = 5;//存储下一个节点的地址node1->next = node2;node2->next = node3;node3->next = node4;node4->next = node5;node5->next = NULL;//单向不带头不循环链表//打印SlNode* plist = node1;SLPrint(plist);
}
void SLTest01()
{SlNode* plist = NULL;//尾插SLPushBack(&plist, 1);SLPushBack(&plist, 2);SLPushBack(&plist, 3);SLPushBack(&plist, 4);SLPrint(plist);//头插SLPushFront(&plist, 5);SLPrint(plist);//尾删SLPopBack(&plist);SLPrint(plist);//头删SLPopFront(&plist);SLPrint(plist);//pos之前插入SlNode* find = SLFind(&plist, 2);SLInsert(&plist, find, 6);SLPrint(plist);//pos之后插入SlNode* find = SLFind(&plist, 3);SLInsertAfter(find, 7);SLPrint(plist);
}
int main()
{SLTest();SLTest01();return 0;
}

3.7.4 代码运行测试



3.8 删除pos节点or pos节点之后的节点🏓

 3.8.0 删除pos节点or pos节点之后的节点思路分析



3.8.1 SList.h

//删除pos节点
void SLErase(SlNode** pphead, SlNode* pos);//删除pos节点之后的节点
void SLEraseAfter(SlNode* pos);

3.8.2 SList.c

//删除pos节点
void SLErase(SlNode** pphead, SlNode* pos)
{assert(pphead && *pphead && pos);//pos是第一个节点if (pos==(*pphead)){*pphead= (*pphead)->next;free(pos);return 1;}//pos不是第一个节点SlNode* prev = *pphead;while (prev->next != pos){prev = prev->next;}prev->next = pos->next;free(pos);pos = NULL;//出于规范
}
//删除pos节点之后的节点
void SLEraseAfter(SlNode* pos)
{//尾节点不行,空指针也不行assert(pos&&pos->next);SlNode* del = pos->next;pos->next = del->next;free(del);
}

3.8.3 test.c

#include"SList.h"
void SLTest()
{//创建节点--->申请空间//存储有效数据SlNode* node1 = (SlNode*)malloc(sizeof(SlNode));node1->data = 1;SlNode* node2 = (SlNode*)malloc(sizeof(SlNode));node2->data = 2;SlNode* node3 = (SlNode*)malloc(sizeof(SlNode));node3->data = 3;SlNode* node4 = (SlNode*)malloc(sizeof(SlNode));node4->data = 4;SlNode* node5 = (SlNode*)malloc(sizeof(SlNode));node5->data = 5;//存储下一个节点的地址node1->next = node2;node2->next = node3;node3->next = node4;node4->next = node5;node5->next = NULL;//单向不带头不循环链表//打印SlNode* plist = node1;SLPrint(plist);
}
void SLTest01()
{SlNode* plist = NULL;//尾插SLPushBack(&plist, 1);SLPushBack(&plist, 2);SLPushBack(&plist, 3);SLPushBack(&plist, 4);SLPrint(plist);//头插SLPushFront(&plist, 5);SLPrint(plist);//尾删SLPopBack(&plist);SLPrint(plist);//头删SLPopFront(&plist);SLPrint(plist);//pos之前插入SlNode* find = SLFind(&plist, 2);//SLInsert(&plist, find, 6);//SLPrint(plist);pos之后插入//SlNode* find = SLFind(&plist, 3);//SLInsertAfter( find, 7);//SLPrint(plist);//删除pos节点/*SLErase(&plist, find);SLPrint(plist);*///删除pos之后SLEraseAfter(find);SLPrint(plist);
}
int main()
{SLTest();SLTest01();return 0;
}

3.8.4 代码运行测试



3.9 销毁🌔

3.9.0 销毁思路分析


3.9.1 SList.h

//销毁
void SLDesTroy(SlNode** pphead);

3.9.2 SList.c

//销毁
void SLDesTroy(SlNode** pphead)
{assert(pphead);SlNode* pcur = *pphead;while (pcur)//注意:如果是pcur->next,那么循环将结束于尾节点没有free的时候{SlNode* next = pcur->next;free(pcur);pcur = next;}*pphead = NULL;
}

3.9.3 test.c

#include"SList.h"
void SLTest()
{//创建节点--->申请空间//存储有效数据SlNode* node1 = (SlNode*)malloc(sizeof(SlNode));node1->data = 1;SlNode* node2 = (SlNode*)malloc(sizeof(SlNode));node2->data = 2;SlNode* node3 = (SlNode*)malloc(sizeof(SlNode));node3->data = 3;SlNode* node4 = (SlNode*)malloc(sizeof(SlNode));node4->data = 4;SlNode* node5 = (SlNode*)malloc(sizeof(SlNode));node5->data = 5;//存储下一个节点的地址node1->next = node2;node2->next = node3;node3->next = node4;node4->next = node5;node5->next = NULL;//单向不带头不循环链表//打印SlNode* plist = node1;SLPrint(plist);
}
void SLTest01()
{SlNode* plist = NULL;//尾插SLPushBack(&plist, 1);SLPushBack(&plist, 2);SLPushBack(&plist, 3);SLPushBack(&plist, 4);SLPrint(plist);//头插SLPushFront(&plist, 5);SLPrint(plist);//尾删SLPopBack(&plist);SLPrint(plist);//头删SLPopFront(&plist);SLPrint(plist);//pos之前插入SlNode* find = SLFind(&plist, 2);//SLInsert(&plist, find, 6);//SLPrint(plist);pos之后插入//SlNode* find = SLFind(&plist, 3);//SLInsertAfter( find, 7);//SLPrint(plist);//删除pos节点/*SLErase(&plist, find);SLPrint(plist);*///删除pos之后SLEraseAfter(find);SLPrint(plist);//销毁SLDesTroy(&plist);SLPrint(plist);
}
int main()
{SLTest();SLTest01();return 0;
}

3.9.4 代码运行测试


本次的分享到这里就结束了!!!

PS:小江目前只是个新手小白。欢迎大家在评论区讨论哦!有问题也可以讨论的!

如果对你有帮助的话,记得点赞👍+收藏⭐️+关注➕

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JS加密/解密之闭包的运用

深入探讨JavaScript闭包的演变与应用 摘要&#xff1a; 本文将深入探讨JavaScript闭包的概念、特性以及其在实际开发中的应用。我们将从闭包的起源开始&#xff0c;探讨它在JavaScript编程中的重要性&#xff0c;并通过实例展示闭包在不同场景下的灵活应用。 引言 JavaScrip…

第一个Vue程序

首先下载vue.min.js或者vue.js Installation — Vue.js 在web文件下创建js文件并把vue.js复制到此文件。 创建一个jsp文件 显示界面

自然语言处理---Transformer机制详解之GPT模型介绍

1 GPT介绍 GPT是OpenAI公司提出的一种语言预训练模型.OpenAI在论文<< Improving Language Understanding by Generative Pre-Training >>中提出GPT模型.OpenAI后续又在论文<< Language Models are Unsupervised Multitask Learners >>中提出GPT2模型.…

如何使用visual studio 2010构建SQLite3.lib文件

sqlite3官网只提供了dll&#xff0c;并没有lib文件。需要自己生成sqlite3.lib。因项目升级到x64&#xff0c;以前并没有生成64位的链接库&#xff0c;需要自己创建。本人电脑操作系统windows 10, 开发环境为visual studio 2010。下面是详细生成过程。 1. 从源下载源&#xff08…

Spring中静态代理设计模式

目录 一、为什么需要代理设计模式 二、代理设计模式 三、静态代理设计模式 3.1 存在的问题 一、为什么需要代理设计模式 在项目的开发过程中我们知道service层是整个项目中最重要的部分&#xff0c;在service中一般会有两个部分&#xff0c;一个是核心业务&#xff0c;一个是额…

力扣每日一题54:螺旋矩阵

题目描述&#xff1a; 给你一个 m 行 n 列的矩阵 matrix &#xff0c;请按照 顺时针螺旋顺序 &#xff0c;返回矩阵中的所有元素。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,2,3],[4,5,6],[7,8,9]] 输出&#xff1a;[1,2,3,6,9,8,7,4,5]示例 2&#xff1a; 输入&#…

mk语法示例

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

『ARM』和『x86』处理器架构解析指南

前言 如果问大家是否知道 CPU&#xff0c;我相信不会得到否定的答案&#xff0c;但是如果继续问大家是否了解 ARM 和 X86 架构&#xff0c;他们的区别又是什么&#xff0c;相信可能部分人就会哑口无言了 目前随着深度学习、高性能计算、NLP、AIGC、GLM、AGI 的技术迭代&#…

自然语言处理---RNN、LSTM、GRU模型

RNN模型 RNN模型概述 RNN(Recurrent Neural Network)&#xff0c;中文称作循环神经网络&#xff0c;它一般以序列数据为输入&#xff0c;通过网络内部的结构设计有效捕捉序列之间的关系特征&#xff0c;一般也是以序列形式进行输出。RNN的循环机制使模型隐层上一时间步产生的…

MSP430F5529时钟系统配置

1、为什么要进行时钟管理&#xff1f;   时钟系统是一个数字器件的命脉&#xff0c;对于普通的51单片机来说&#xff0c;它的时钟来源只有外部晶振&#xff0c;然后每12个振荡周期完成一个基本操作&#xff0c;所以也叫做12T单片机&#xff0c;但对于当前高级一点的单片机来…

Spring5学习笔记—高级注解

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a; Spring专栏 ✨特色专栏&#xff1a; M…

Python 创建或读取 Excel 文件

Excel是一种常用的电子表格软件&#xff0c;广泛应用于金融、商业和教育等领域。它提供了强大的数据处理和分析功能&#xff0c;可进行各种计算和公式运算&#xff0c;并能创建各种类型的图表和可视化数据。Excel的灵活性使其成为处理和管理数据的重要工具。本文将介绍如何使用…

【微信小程序】6天精准入门(第5天:利用案例与后台的数据交互)附源码

一、什么是后台交互&#xff1f; 在小程序中&#xff0c;与后台交互指的是小程序前端与后台服务器之间的数据通信和请求处理过程。通过与后台交互&#xff0c;小程序能够获取服务器端的数据、上传用户数据、发送请求等。 小程序与后台交互可以实现数据的传输、用户认证、实时消…

什么是Sectigo证书?

Sectigo证书&#xff0c;早前被称为Comodo证书&#xff0c;是一种SSL&#xff08;安全套接层&#xff09;证书&#xff0c;用于保护互联网上的数据传输的安全性和隐私性。这些证书由全球领先的SSL证书颁发机构Sectigo颁发&#xff0c;被广泛用于网站、应用程序和服务器上。本文…

hexo发生错误 Error: Spawn failed

错误描述 仓库中有东西&#xff0c;运行如下命令后报错 hexo d报错提示: 原因分析: 看别人的博客是用git进行push或hexo d的时候改变了一些.deploy_git文件下的内容&#xff0c;这个.deploy_git的内容对于hexo来说可能是系统文件&#xff0c;这里挖坑 解决办法 一个个的…

分布式Trace:横跨几十个分布式组件的慢请求要如何排查?

目录 前言 一、问题的出现&#xff1f; 二、一体化架构中的慢请求排查如何做 三、分布式 Trace原理 四、如何来做分布式 Trace 前言 在分布式服务架构下&#xff0c;一个 Web 请求从网关流入&#xff0c;有可能会调用多个服务对请求进行处理&#xff0c;拿到最终结果。这个…

自然语言处理---注意力机制

注意力概念 观察事物时&#xff0c;之所以能够快速判断一种事物(当然允许判断是错误的)&#xff0c;是因为大脑能够很快把注意力放在事物最具有辨识度的部分从而作出判断&#xff0c;而并非是从头到尾的观察一遍事物后&#xff0c;才能有判断结果。正是基于这样的理论&#xf…

函数和执行上下文

一.变量提升与函数提升 变量提升&#xff1a;通过var关键字定义&#xff08;声明&#xff09;的变量&#xff0c;在定义语句之前就可以访问到&#xff0c;只不过其值是undefined 函数提升&#xff1a;通过function声明的函数&#xff0c;在之前就可以调用&#xff0c;值是函数…

聊一聊如何在Vue中使用事件总线( Event Bus)进行组件间通信

事件总线模式允许不同的组件之间进行通信。它要求一个中央枢纽&#xff0c;组件可以通过它发送和接收事件&#xff0c;从而使组件之间的数据交换和交互更加顺畅。本文探讨了它的使用方法&#xff0c;以便开发人员能够充分利用它在Vue开发中的潜力。 跨通信是应用程序中组件之间…

STM32F4X定时器之基本定时器

一、定时器的概述 进行有规律的计数&#xff0c;每记一次数的时间都是固定的 定时器的本质&#xff1a;计数的总时间 记一次数的时间&#xff08;时钟的频率&#xff09; * 记多少次&#xff08;重装载值&#xff09;。 基本定时器属于片上外设&#xff0c;系统滴答定时器是…