数据结构——链表

目录

一、链表

  1.1 链表的概念

二、单链表

  2.1 单链表的概念

  2.2单链表的操作

    2.2.1 单链表的结点创建

    2.2.2 单链表的头插

    2.2.3 单链表遍历

    2.2.4 单链表的头删

    2.2.5 单链表的尾插

    2.2.6 单链表的尾删

    2.2.7 单链表按位置插入

    2.2.8 单链表按位置删除

    2.2.9 单链表按位置修改

    2.2.10 单链表按位置查找

    2.2.11 单链表按元素查找

    2.2.12 单链表按元素删除

    2.2.13 单链表按元素修改

    2.2.14 单链表逆置

    2.2.15 单链表查找倒数第n个节点

    2.2.16 单链表排序

    2.2.17 单链表释放内存

  2.3 单链表所有程序

    2.3.1 head.h

    2.3.2 main.c

    2.3.3 fun.c

    2.3.4 效果


一、链表

  1.1 链表的概念

        1. 引入目的:顺序表的方便修改和查找,不方便插入和删除,插入的和删除的时间复杂度是O(n),并且顺序表存在满的情况,顺序表是否用于数据量较小的情况,所以引出链表。

        2.链表:线性表的链式存储,称为链表

                逻辑结构:线性结构(一对一关系)

                存储结构:链式存储(内存空间任意一段),

                逻辑相邻,物理不一定相邻

        3.链表的分类:单向链表,单向循环链表,双向链表,双向循环链表

                

二、单链表

  2.1 单链表的概念

        1.单链表:只能从头开始单向向后遍历访问节点的链表,称为单链表

        2.结点:包含数据域,指针域

                数据域:存储数据元素

                指针域:下一个节点的地址

        3.结点结构体的定义

        4.链表的插入和删除的思想

  2.2单链表的操作

  PS:head.h中函数声明,在main.c和fun.c中引用head.h

    2.2.1 单链表的结点创建

// 创建单链表---------------
Linklist creat_node()
{// 1.创建一个新的节点Linklist s=(Linklist)malloc(sizeof(struct Node));// 2. if(NULL==s)return NULL;// 初始化新节点的数据域s->data=0;// 初始化新节点的指针域s->next=NULL;return s;
}

    2.2.2 单链表的头插

// 头插---------------
Linklist insert_head(Linklist head,datatype element)
{Linklist s=creat_node();s->data=element;// 1.判断链表是否为空if(NULL==head)head=s;else  // 链表中存在多个节点 >=1{s->next=head;head=s;}return head;
}

    2.2.3 单链表遍历

// 循环遍历---------------
void output(Linklist head)
{//  1.判断链表是否为空if(NULL==head)return;// 2.循环遍历Linklist p=head;printf("Linklist=");while(p!=NULL){printf("%d ",p->data);p=p->next;}putchar(10);return;
}

    2.2.4 单链表的头删

// 单链表的头删---------------
Linklist delete_head(Linklist head)
{// 1.判断链表是否为空if(NULL==head)return head;// 2.头删Linklist del;del=head;head=head->next;free(del);del=NULL;return head;
}

    2.2.5 单链表的尾插

// 单链表的尾插---------------
Linklist insert_tail(Linklist head,datatype element)
{// 1.创建新节点,并输入值Linklist s=creat_node();s->data=element;s->next=NULL;// 2.判断链表是否为空if(NULL==head){head=s;}else{// 3.尾插Linklist p=head;while(p->next)  // 找到最后一个节点{p=p->next;}p->next=s;  // 链接:p指针域指向新节点的地址}return head;
}

    2.2.6 单链表的尾删

// 单链表的尾删---------------
Linklist delete_tail(Linklist head)
{// 1.判断链表是否为空if(NULL==head)return head;// 2.只有一个节点时else if(head->next==NULL){free(head);head=NULL;}// 3.有多个节点时else{Linklist del=head;// 找到倒数第二个节点while(del->next->next){del=del->next;}// 删除p的后继free(del->next);del->next=NULL;}return head;
}

    2.2.7 单链表按位置插入

// 查询链表长度---------------
int get_len(Linklist head)
{Linklist p=head;int len=0;while(p!=NULL){p=p->next;len++;}return len;
}
// 单链表按位置插入---------------
Linklist insert_pos(Linklist head,datatype element,int pos)
{// 1.判断插入的位置是否合法if(pos<1||pos>get_len(head)+1){return head;}// 2.头插if(pos==1){head=insert_head(head,element);return head;}// 3.尾插if(pos==get_len(head)+1){head=insert_tail(head,element);}// 4.位置大于1,且合法Linklist del=head;// 找到要插入的前一个位置for(int i=1;i<pos-1;i++){del=del->next;}// 创建一个新的节点,并赋值Linklist s=creat_node();s->data=element;// 链接指针域s->next=del->next;del->next=s;return head;
}

    2.2.8 单链表按位置删除

// 单链表按位置删除---------------
Linklist delete_pos(Linklist head,int pos)
{// 1.判断链表是否为空// 2.判断删除位置是否合法if(NULL==head||pos<1||pos>get_len(head)){return head;}// 3.头删if(pos==1){head=delete_head(head);return head;}// 4.位置大于1,且位置合法Linklist del=head;for(int i=1;i<pos-1;i++)  // 找到删除位置前一个位置{del=del->next;}Linklist s=del->next;del->next=s->next;  // 让删除位置前一个节点与后一个节点链接free(s);  // 释放删除位置空间s=NULL;return head;
}

    2.2.9 单链表按位置修改

// 单链表按位置修改---------------
Linklist change_pos(Linklist head,datatype element,int pos)
{// 1.判断链表是否为空// 2.判断修改的位置是否合法if(NULL==head||pos<0||pos>get_len(head)){return head;}// 3.按位置修改else{// 找到修改的位置Linklist del=head;for(int i=1;i<pos;i++){del=del->next;}del->data=element;return head;}
}

    2.2.10 单链表按位置查找

// 单链表按位置查找---------------
int find_pos(Linklist head,int pos)
{// 1.判断链表是否为空// 2.判断查找位置是否合法if(NULL==head||pos<0||pos>get_len(head)){return FALSE;}// 3.查询位置元素else{// 找到查询位置Linklist del=head;for(int i=1;i<pos;i++){del=del->next;}// 返回该位置元素return del->data;}
}

    2.2.11 单链表按元素查找

// 单链表按元素查找---------------
int find_element(Linklist head,datatype element)
{// 1.判断链表是否为空if(NULL==head){return FALSE;}// 2.判断查找元素是否存在,存在则记录位置Linklist del=head;int pos=0;int data;for(int i=1;i<=get_len(head);i++){if(del->data==element){pos=i;// 调用按位置查找函数find_pos(head,pos);}del=del->next;}return pos;
}

    2.2.12 单链表按元素删除

// 单链表按元素删除---------------
Linklist delete_element(Linklist head,datatype element)
{// 1.判断链表是否为空if(NULL==head){return head;}// 2.判断删除元素是否存在,存在则记录位置Linklist del=head;int pos;for(int i=1;i<=get_len(head);i++){if(del->data==element){pos=i;  // 记录元素位置head=delete_pos(head,pos);  // 调用按位置删除函数,删除元素del=head;}else{del=del->next;}}return head;
}

    2.2.13 单链表按元素修改

// 单链表按元素修改---------------
void change_element(Linklist head,datatype element,datatype element2)
{// 1.判断链表是否为空if(NULL==head){return;}// 2.判断修改元素是否存在,若存在则直接修改Linklist del=head;while(del){if(del->data==element){del->data=element2;return;}del=del->next;}
}

    2.2.14 单链表逆置

// 单链表逆置---------------
Linklist reve_list(Linklist head)
{// 1.判断链表是否为空if(NULL==head){return head;}// 2.用切断再链接的方法逆置链表Linklist p=head->next;  // 记录后续被切断的节点地址head->next=NULL;  // 切断第一个节点Linklist s;  // 中间值while(p){s=p;  // 记录被切断节点p=p->next;  // 记录被切断节点下一个节点s->next=head;  // 让被切断节点指向上一个被切断节点head=s;  // 让刚链接过来的节点成为头节点}return head;
}

    2.2.15 单链表查找倒数第n个节点

// 单链表查找倒数第n个节点---------------
int find_repos(Linklist head,int pos)
{// 1.判断链表是否为空// 2.判断位置是否合法if(NULL==head||pos<0||pos>get_len(head)){return FALSE;}// 3.找到查找位置pos=get_len(head)-pos+1;// 4.调用按位置查找函数输出int data;data=find_pos(head,pos);return data;
}

    2.2.16 单链表排序

// 单链表排序---------------
void sort_list(Linklist head)
{// 1.判断链表是否为空// 2.判断节点数是否为1if(NULL==head||head->next==NULL){return;}// 3.排序Linklist del=head;int temp;for(int i=1;i<get_len(head);i++){for(int j=1;j<get_len(head);j++){if(del->data>del->next->data){temp=del->data;del->data=del->next->data;del->next->data=temp;}del=del->next;}del=head;}return;
}

    2.2.17 单链表释放内存

// 单链表释放内存---------------
void free_list(Linklist head)
{// 1.判断链表是否为空if(NULL==head){return;}// 2.释放内存Linklist s=head;while(head){s=head;  // 记录头结点位置head=head->next;  // 使头结点下一个节点成为新的头结点s->next=NULL;  // 断开原头结点free(s); // 释放原头结点}s=NULL;return;
}

  2.3 单链表所有程序

    2.3.1 head.h

#ifndef __HEAD_H__
#define __HEAD_H__#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef int datatype;
enum passble{SUCCSSES,FALSE=-1};
// 节点结构定义
// 节点:数据、指针域
// Node不可省略
typedef struct Node
{datatype data;  // 数据域:数据元素struct Node *next;  // 指针域:节点之间的关系,下一个节点的地址
}*Linklist;Linklist creat_node();
Linklist insert_head(Linklist head,datatype element);
void output(Linklist head);
Linklist delete_head(Linklist);
Linklist insert_tail(Linklist head,datatype element);
Linklist delete_tail(Linklist head);
int get_len(Linklist head);
Linklist insert_pos(Linklist head,datatype element,int pos);
Linklist delete_pos(Linklist head,int pos);
Linklist change_pos(Linklist head,datatype element,int pos);
int find_pos(Linklist head,int pos);
int find_element(Linklist head,datatype element);
Linklist delete_element(Linklist head,datatype element);
void change_element(Linklist head,datatype element,datatype element2);
Linklist reve_list(Linklist head);
int find_repos(Linklist head,int pos);
void sort_list(Linklist head);
void free_list(Linklist head);#endif

    2.3.2 main.c

#include "head.h"
int main(int argc, const char *argv[])
{
// 单链表的创建
// 单链表的头插Linklist head=NULL;int n;printf("请输入插入个数:");scanf("%d",&n);datatype element;for(int i=0;i<n;i++){printf("请输入插入的第 %d 个元素:",i+1);scanf("%d",&element);head=insert_head(head,element);}output(head);// 单链表的头删head=delete_head(head);printf("头删后");output(head);
// 单链表的尾插printf("请输入尾插个数:");scanf("%d",&n);for(int i=0;i<n;i++){printf("请输入尾插元素:");scanf("%d",&element);head=insert_tail(head,element);}output(head);// 单链表的尾删head=delete_tail(head);printf("尾删后");output(head);// 单链表按位置插入int pos;printf("请输入插入位置:");scanf("%d",&pos);printf("请输入插入元素:");scanf("%d",&element);head=insert_pos(head,element,pos);output(head);// 单链表按位置删除printf("请输入删除位置:");scanf("%d",&pos);head=delete_pos(head,pos);output(head);// 单链表按位置修改printf("请输入要修改位置:");scanf("%d",&pos);printf("请输入修改后的值:");scanf("%d",&element);head=change_pos(head,element,pos);output(head);// 单链表按位置查找printf("请输入要查询的位置:");scanf("%d",&pos);datatype data;data=find_pos(head,pos);if(pos==FALSE){printf("查询出错\n");}else{printf("第%d位是%d\n",pos,data);}// 单链表按元素查找printf("请输入查找的元素:");scanf("%d",&element);pos=find_element(head,element);if(pos==FALSE||pos==0){printf("查询有误\n");}else{printf("%d在第%d位\n",element,pos);}// 单链表按元素删除printf("请输入要删除的元素:");scanf("%d",&element);head=delete_element(head,element);output(head);// 单链表按元素修改printf("请输入要修改的元素:");scanf("%d",&element);datatype element2;printf("请输入修改后的元素:");scanf("%d",&element2);change_element(head,element,element2);output(head);// 单链表逆置head=reve_list(head);printf("逆置后:");output(head);// 单链表查找倒数第n个节点printf("请输入要查找倒数第几个节点的值:");scanf("%d",&pos);data=find_repos(head,pos);if(pos==FALSE){printf("查询出错\n");}else{printf("倒数第%d位是%d\n",pos,data);}// 单链表排序sort_list(head);printf("对链表顺序排序后:");output(head);// 单链表释放内存free_list(head);return 0;
}

    2.3.3 fun.c

#include "head.h"
// 创建单链表---------------
Linklist creat_node()
{// 1.创建一个新的节点Linklist s=(Linklist)malloc(sizeof(struct Node));// 2. if(NULL==s)return NULL;// 初始化新节点的数据域s->data=0;// 初始化新节点的指针域s->next=NULL;return s;
}
// 头插---------------
Linklist insert_head(Linklist head,datatype element)
{Linklist s=creat_node();s->data=element;// 1.判断链表是否为空if(NULL==head)head=s;else  // 链表中存在多个节点 >=1{s->next=head;head=s;}return head;
}// 循环遍历---------------
void output(Linklist head)
{//  1.判断链表是否为空if(NULL==head)return;// 2.循环遍历Linklist p=head;printf("Linklist=");while(p!=NULL){printf("%d ",p->data);p=p->next;}putchar(10);return;
}
// 单链表的头删---------------
Linklist delete_head(Linklist head)
{// 1.判断链表是否为空if(NULL==head)return head;// 2.头删Linklist del;del=head;head=head->next;free(del);del=NULL;return head;
}
// 单链表的尾插---------------
Linklist insert_tail(Linklist head,datatype element)
{// 1.创建新节点,并输入值Linklist s=creat_node();s->data=element;s->next=NULL;// 2.判断链表是否为空if(NULL==head){head=s;}else{// 3.尾插Linklist p=head;while(p->next)  // 找到最后一个节点{p=p->next;}p->next=s;  // 链接:p指针域指向新节点的地址}return head;
}
// 单链表的尾删---------------
Linklist delete_tail(Linklist head)
{// 1.判断链表是否为空if(NULL==head)return head;// 2.只有一个节点时else if(head->next==NULL){free(head);head=NULL;}// 3.有多个节点时else{Linklist del=head;// 找到倒数第二个节点while(del->next->next){del=del->next;}// 删除p的后继free(del->next);del->next=NULL;}return head;
}// 查询链表长度---------------
int get_len(Linklist head)
{Linklist p=head;int len=0;while(p!=NULL){p=p->next;len++;}return len;
}
// 单链表按位置插入---------------
Linklist insert_pos(Linklist head,datatype element,int pos)
{// 1.判断插入的位置是否合法if(pos<1||pos>get_len(head)+1){return head;}// 2.头插if(pos==1){head=insert_head(head,element);return head;}// 3.尾插if(pos==get_len(head)+1){head=insert_tail(head,element);}// 4.位置大于1,且合法Linklist del=head;// 找到要插入的前一个位置for(int i=1;i<pos-1;i++){del=del->next;}// 创建一个新的节点,并赋值Linklist s=creat_node();s->data=element;// 链接指针域s->next=del->next;del->next=s;return head;
}// 单链表按位置删除---------------
Linklist delete_pos(Linklist head,int pos)
{// 1.判断链表是否为空// 2.判断删除位置是否合法if(NULL==head||pos<1||pos>get_len(head)){return head;}// 3.头删if(pos==1){head=delete_head(head);return head;}// 4.位置大于1,且位置合法Linklist del=head;for(int i=1;i<pos-1;i++)  // 找到删除位置前一个位置{del=del->next;}Linklist s=del->next;del->next=s->next;  // 让删除位置前一个节点与后一个节点链接free(s);  // 释放删除位置空间s=NULL;return head;
}// 单链表按位置修改---------------
Linklist change_pos(Linklist head,datatype element,int pos)
{// 1.判断链表是否为空// 2.判断修改的位置是否合法if(NULL==head||pos<0||pos>get_len(head)){return head;}// 3.按位置修改else{// 找到修改的位置Linklist del=head;for(int i=1;i<pos;i++){del=del->next;}del->data=element;return head;}
}// 单链表按位置查找---------------
int find_pos(Linklist head,int pos)
{// 1.判断链表是否为空// 2.判断查找位置是否合法if(NULL==head||pos<0||pos>get_len(head)){return FALSE;}// 3.查询位置元素else{// 找到查询位置Linklist del=head;for(int i=1;i<pos;i++){del=del->next;}// 返回该位置元素return del->data;}
}// 单链表按元素查找---------------
int find_element(Linklist head,datatype element)
{// 1.判断链表是否为空if(NULL==head){return FALSE;}// 2.判断查找元素是否存在,存在则记录位置Linklist del=head;int pos=0;int data;for(int i=1;i<=get_len(head);i++){if(del->data==element){pos=i;// 调用按位置查找函数find_pos(head,pos);}del=del->next;}return pos;
}// 单链表按元素删除---------------
Linklist delete_element(Linklist head,datatype element)
{// 1.判断链表是否为空if(NULL==head){return head;}// 2.判断删除元素是否存在,存在则记录位置Linklist del=head;int pos;for(int i=1;i<=get_len(head);i++){if(del->data==element){pos=i;  // 记录元素位置head=delete_pos(head,pos);  // 调用按位置删除函数,删除元素del=head;}else{del=del->next;}}return head;
}// 单链表按元素修改---------------
void change_element(Linklist head,datatype element,datatype element2)
{// 1.判断链表是否为空if(NULL==head){return;}// 2.判断修改元素是否存在,若存在则直接修改Linklist del=head;while(del){if(del->data==element){del->data=element2;return;}del=del->next;}
}// 单链表逆置---------------
Linklist reve_list(Linklist head)
{// 1.判断链表是否为空if(NULL==head){return head;}// 2.用切断再链接的方法逆置链表Linklist p=head->next;  // 记录后续被切断的节点地址head->next=NULL;  // 切断第一个节点Linklist s;  // 中间值while(p){s=p;  // 记录被切断节点p=p->next;  // 记录被切断节点下一个节点s->next=head;  // 让被切断节点指向上一个被切断节点head=s;  // 让刚链接过来的节点成为头节点}return head;
}// 单链表查找倒数第n个节点---------------
int find_repos(Linklist head,int pos)
{// 1.判断链表是否为空// 2.判断位置是否合法if(NULL==head||pos<0||pos>get_len(head)){return FALSE;}// 3.找到查找位置pos=get_len(head)-pos+1;// 4.调用按位置查找函数输出int data;data=find_pos(head,pos);return data;
}// 单链表排序---------------
void sort_list(Linklist head)
{// 1.判断链表是否为空// 2.判断节点数是否为1if(NULL==head||head->next==NULL){return;}// 3.排序Linklist del=head;int temp;for(int i=1;i<get_len(head);i++){for(int j=1;j<get_len(head);j++){if(del->data>del->next->data){temp=del->data;del->data=del->next->data;del->next->data=temp;}del=del->next;}del=head;}return;
}// 单链表释放内存---------------
void free_list(Linklist head)
{// 1.判断链表是否为空if(NULL==head){return;}// 2.释放内存Linklist s=head;while(head){s=head;  // 记录头结点位置head=head->next;  // 使头结点下一个节点成为新的头结点s->next=NULL;  // 断开原头结点free(s); // 释放原头结点}s=NULL;return;
}

    2.3.4 效果

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

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

相关文章

LeetCode每日精进:142.环形链表II

题目链接&#xff1a;142.环形链表II 题目描述&#xff1a; 给定一个链表的头节点 head &#xff0c;返回链表开始入环的第一个节点。 如果链表无环&#xff0c;则返回 null。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环…

【办公类-90-02】】20250215大班周计划四类活动的写法(分散运动、户外游戏、个别化综合)

背景需求&#xff1a; 做了中班的四类活动安排表&#xff0c;我顺便给大班做一套 【办公类-90-01】】20250213中班周计划四类活动的写法&#xff08;分散运动、户外游戏、个别化&#xff08;美工室图书吧探索室&#xff09;&#xff09;-CSDN博客文章浏览阅读874次&#xff0…

网络工程师 (42)IP地址

一、定义与功能 IP地址是IP协议提供的一种统一的地址格式&#xff0c;它为互联网上的每一个网络和每一台主机分配一个逻辑地址&#xff0c;以此来屏蔽物理地址的差异。这种地址分配方式确保了用户在连网的计算机上操作时&#xff0c;能够高效且方便地从众多计算机中选出自己所需…

cap1:TensorRT介绍及CUDA环境安装

《TensorRT全流程部署指南》专栏文章目录&#xff1a; cap1&#xff1a;TensorRT介绍及CUDA环境安装cap2&#xff1a;1000分类的ResNet的TensorRT部署指南&#xff08;python版&#xff09;cap3&#xff1a;自定义数据集训练ResNet的TensorRT部署指南&#xff08;python版&…

保持角色一致性的绘本生成AI开源项目之Story-Adapter本地部署Windows篇

本文已首发&#xff1a;秋码记录 在人工智能领域&#xff0c;生成一致且连贯的故事绘本一直是一个具有挑战性的任务。Story-Adapter作为一个开源项目&#xff0c;旨在解决这一问题&#xff0c;为用户提供无需训练即可生成长篇故事视觉化的工具。本文将指导您如何在Windows系统…

[JVM篇]垃圾回收器

垃圾回收器 Serial Seral Old PartNew CMS(Concurrent Mark Sweep) Parallel Scavenge Parallel Old G1 ZGC

字符串(典型算法思想)—— OJ例题算法解析思路

目录 一、14. 最长公共前缀 - 力扣&#xff08;LeetCode&#xff09; 解法一&#xff1a;算法代码&#xff08;两两比较&#xff09; 1. 初始化公共前缀 2. 遍历字符串数组 3. 辅助函数 findCommon 4. 返回最终结果 总结 解法二&#xff1a;算法代码&#xff08;统一比较…

宝塔面板开始ssl后,使用域名访问不了后台管理

宝塔面板后台开启ssl访问后&#xff0c;用的证书是其他第三方颁发的证书 再使用 域名/xxx 的形式&#xff1a;https://域名:xxx/xxx 访问后台&#xff0c;结果出现如下&#xff0c;不管使用 http 还是 https 的路径访问都进不后台管理 这个时候可以使用 https://ip/xxx 的方式来…

java继承

1.继承的内存图 2.成员方法不能被继承 虚方法表满足&#xff1a;1.非static、2.非private、3.非final

通用知识库问答流程

总体流程&#xff0c;定义回调&#xff08;函数执行完把回答的内容填充到数据库&#xff09;&#xff0c;使用封装的fastchat获取调用的模型&#xff0c; 根据向量数据库名&#xff0c;获取向量数据库实例 这是ssl 长连接的一种标准写法&#xff0c;首先写一个 生成器函数&…

WPS/Office使用其他LLM大语言模型作为AI助手

前言 WPS也有内置的AI&#xff0c;叫灵犀&#xff0c;但只能说是属于“能用&#xff0c;有好过无”&#xff0c;所以我一直在找能否在WPS上用上其他的LLM大语言模型&#xff0c;比如目前最火的DeepSeek&#xff0c;结论是&#xff1a;安装OfficeAI助手&#xff0c;就能在WPS上用…

亲测有效!使用Ollama本地部署DeepSeekR1模型,指定目录安装并实现可视化聊天与接口调用

文章目录 一、引言二、准备工作&#xff08;Ollama 工具介绍与下载&#xff09;2.1 Ollama介绍2.2 Ollama安装 三、指定目录安装 DeepSeek R1四、Chatbox 可视化聊天搭建4.1 Chatbox下载安装4.2 关联 DeepSeek R1 与 Chatbox 的步骤 五、使用 Ollama 调用 DeepSeek 接口5.1 请求…

4.SpringSecurity在分布式环境下的使用

参考 来源于黑马程序员&#xff1a; 手把手教你精通新版SpringSecurity 分布式认证概念说明 分布式认证&#xff0c;即我们常说的单点登录&#xff0c;简称SSO&#xff0c;指的是在多应用系统的项目中&#xff0c;用户只需要登录一次&#xff0c;就可以访 问所有互相信任的应…

傅里叶公式推导(五)

文章目录 从离散到连续回顾第四章F(w) 从离散到连续 回顾第四章 在周期 T&#xff0c; 傅里叶变换公式 f ( t ) ( t T ) f ( t ) ∑ n − ∞ ∞ C n e i n Δ w t C n 1 T ∫ 0 T f ( t ) e − i n Δ w t d t 式1 f(t)(tT) \\ f(t) \sum_{n-\infty}^{\infty }C_ne^{i…

VS Code User和System版区别【推荐使用System版本】and VSCode+Keil协同开发之Keil Assistant

VS Code User和System版区别 Chapter1 VS Code User和System版区别1. 对于安装而言2. 结束语 Chapter2 VS Code 安装、配置教程及插件推荐插件&#xff1a; Chapter3 VSCodeKeil协同开发之Keil Assistant1. 效果展示2. Keil Assistant简介3. Keil Assistant功能特性4. 部署步骤…

Python----Python高级(网络编程:网络高级:多播和广播,C/S架构,TCP,UDP,网络编程)

一、多播和广播 1.1、多播 1.1.1、定义 多播&#xff08;Multicast&#xff09;也称为组播&#xff0c;是一种一对多的通信方式&#xff0c;将信息从单个源发送到 多个特定的接收者。这些接收者组成一个特定的多播组&#xff0c;只有加入该组的设备才会接 收和处理多播数据。…

网络工程师 (41)IP协议、IP地址表示方法

一、IP协议 IP协议&#xff0c;全称网际互连协议&#xff08;Internet Protocol&#xff09;&#xff0c;是TCP/IP体系中的网络层协议。 寻址&#xff1a;IP协议通过IP地址来唯一标识网络上的每一台设备&#xff0c;确保数据能够准确地发送到目标主机。路由选择&#xff1a;IP协…

Kubernetes控制平面组件:etcd高可用集群搭建

云原生学习路线导航页&#xff08;持续更新中&#xff09; kubernetes学习系列快捷链接 Kubernetes架构原则和对象设计&#xff08;一&#xff09;Kubernetes架构原则和对象设计&#xff08;二&#xff09;Kubernetes架构原则和对象设计&#xff08;三&#xff09;Kubernetes控…

Banana Pi OpenWRT One 官方路由器的第一印象

OpenWRT One是OpenWRT开源社区推出的首款官方开发板&#xff0c;与Banana Pi社区共同设计&#xff0c;由Banana Pi制造和发行。路由器采用蓝色铝合金外壳&#xff0c;质感极佳&#xff0c;视觉效果远超宣传图。整体设计简洁&#xff0c;呈长方形&#xff0c;虽然不是特别时尚&a…

【每日一题 | 2025】2.10 ~ 2.16

个人主页&#xff1a;Guiat 归属专栏&#xff1a;每日一题 文章目录 1. 【2.10】P8707 [蓝桥杯 2020 省 AB1] 走方格2. 【2.11】P8742 [蓝桥杯 2021 省 AB] 砝码称重3. 【2.12】P8786 [蓝桥杯 2022 省 B] 李白打酒加强版4. 【2.13】P8725 [蓝桥杯 2020 省 AB3] 画中漂流5. 【2.…