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

学习记录day16—— 数据结构 双向链表 循环链表

双向链表

1、概念

        1)就是从任意一个节点既能存储其前驱节点,又能存储后继节点

        2)结构体中增加一个指向前驱节点的指针

//定义数据类型
typedef int datatype;//定义节点类型
typedef struct Node
{union {int len;datatype data;};struct Node *prio; struct Node *next; };

        3)头节点没有前驱,最后一个节点没有后继

2、创建虚拟链表

// 创建链表
NodePtr list_create()
{// 在堆区申请一个头节点NodePtr L = (NodePtr)malloc(sizeof(Node));if (NULL == L){printf("创建失败\n");return NULL;}L->len = 0;L->next = NULL;L->prio = NULL;printf("链表创建成功\n");return L;
}

3、申请封装数据

// 申请封装数据
NodePtr apply_node(datatype e)
{NodePtr p = (NodePtr)malloc(sizeof(Node));if (NULL == p){printf("数据类型不合法,封装失败\n");return NULL;}p->data = e;p->prio = NULL;p->next = NULL;return p;
}

4、判空

// 判空
int list_empty(NodePtr L)
{return L->next == NULL;
}

5、头插

// 头插
int list_insert_head(NodePtr L, datatype e)
{if (NULL == L){printf("数据类型不合法,头插失败\n");return -1;}NodePtr p = apply_node(e);if (NULL == p){printf("数据封装失败,头插失败\n");return -1;}if (list_empty(L)){p->prio = L;L->next = p;}else{p->prio = L;p->next =  L->next;L->next->prio = p; // p->next->prio =p;L->next = p;}L->len++;printf("插入成功\n");return 0;
}

6、链表遍历

// 链表遍历
int list_show(NodePtr L)
{if (NULL == L || list_empty(L)){printf("遍历失败\n");return -1;}NodePtr q = L->next; // 定义遍历指针从第一个节点出发while (q){// 输出数据域printf("%c", q->data);q = q->next; // 指针指向下一数据域}putchar(10);printf("遍历结束\n");
}

7、按完整查找

// 按位置查找
NodePtr list_search_pos(NodePtr L,datatype pos)
{if (NULL == L || list_empty(L) || pos > L->len || pos < 0){printf("查找失败\n");return NULL;}NodePtr q = L;for(int i = 0;i < pos ; i++){q = q->next;}printf("查找成功\n");return q;
}

8、按位置删除

// 按位置删除
int list_delete_pos(NodePtr L,datatype pos)
{if (NULL == L || list_empty(L) || pos < 1 || pos > L->len){printf("按位置删除失败\n");return -1;}NodePtr q = list_search_pos(L,pos);if (q->next == NULL){q->prio->next = NULL;}else{// q->next->prio = q->prio;// q->next->prio->next = q->next;q->prio->next = q->next;q->next->prio = q->prio;}L->len--;free(q);q = NULL;printf("删除成功\n");return 0;
}

9、链表删除

// 链表删除
void list_destroy(NodePtr L)
{if (NULL == L ){printf("删除失败\n");return;}while (L->next/*!(list_empty(L))*/){list_delete_pos(L,1);}if (L->next = NULL){free(L);L->next = NULL;}printf("删除成功\n");return ;
}

10、完整代码

00.h

#ifndef day16_flag_h
#define day16_flag_h
#include <myhead.h>typedef char datatype;typedef struct Node
{union {int len;datatype data;};struct Node *prio;struct Node *next;}Node,*NodePtr;NodePtr list_create();int  list_empty(NodePtr L);NodePtr apply_node(datatype e);int  list_insert_head(NodePtr l,datatype e);int list_show(NodePtr L);int list_search(NodePtr L,datatype pos);int list_delete_pos(NodePtr L,datatype e);void list_destroy(NodePtr L);#endif // day16_flag_h

00.c 

#include "00.h"
#define MAX 50// 创建链表
NodePtr list_create()
{// 在堆区申请一个头节点NodePtr L = (NodePtr)malloc(sizeof(Node));if (NULL == L){printf("创建失败\n");return NULL;}L->len = 0;L->next = NULL;L->prio = NULL;printf("链表创建成功\n");return L;
}// 判空
int list_empty(NodePtr L)
{return L->next == NULL;
}// 申请封装数据
NodePtr apply_node(datatype e)
{NodePtr p = (NodePtr)malloc(sizeof(Node));if (NULL == p){printf("数据类型不合法,封装失败\n");return NULL;}p->data = e;p->prio = NULL;p->next = NULL;return p;
}// 头插
int list_insert_head(NodePtr L, datatype e)
{if (NULL == L){printf("数据类型不合法,头插失败\n");return -1;}NodePtr p = apply_node(e);if (NULL == p){printf("数据封装失败,头插失败\n");return -1;}if (list_empty(L)){p->prio = L;L->next = p;}else{p->prio = L;p->next =  L->next;L->next->prio = p; // p->next->prio =p;L->next = p;}L->len++;printf("插入成功\n");return 0;
}// 链表遍历
int list_show(NodePtr L)
{if (NULL == L || list_empty(L)){printf("遍历失败\n");return -1;}NodePtr q = L->next; // 定义遍历指针从第一个节点出发while (q){// 输出数据域printf("%c", q->data);q = q->next; // 指针指向下一数据域}putchar(10);printf("遍历结束\n");
}// 按位置查找
NodePtr list_search_pos(NodePtr L,datatype pos)
{if (NULL == L || list_empty(L) || pos > L->len || pos < 0){printf("查找失败\n");return NULL;}NodePtr q = L;for(int i = 0;i < pos ; i++){q = q->next;}printf("查找成功\n");return q;
}// 按位置删除
int list_delete_pos(NodePtr L,datatype pos)
{if (NULL == L || list_empty(L) || pos < 1 || pos > L->len){printf("按位置删除失败\n");return -1;}NodePtr q = list_search_pos(L,pos);if (q->next == NULL){q->prio->next = NULL;}else{// q->next->prio = q->prio;// q->next->prio->next = q->next;q->prio->next = q->next;q->next->prio = q->prio;}L->len--;free(q);q = NULL;printf("删除成功\n");return 0;
}// 链表删除
void list_destroy(NodePtr L)
{if (NULL == L ){printf("删除失败\n");return;}while (L->next/*!(list_empty(L))*/){list_delete_pos(L,1);}if (L->next = NULL){free(L);L->next = NULL;}printf("删除成功\n");return ;
}

00main.c

#include "00.h"int main(int argc, char const *argv[])
{NodePtr L = list_create();if (NULL == L ){return -1;}list_insert_head(L,'H');list_show(L);list_insert_head(L,'e');list_show(L);list_insert_head(L,'l');list_show(L);list_insert_head(L,'l');list_show(L);list_insert_head(L,'o');list_show(L);list_delete_pos(L,1);list_show(L);list_delete_pos(L,2);list_show(L);list_delete_pos(L,L->len);list_show(L);list_destroy(L);list_show(L);return 0;
}

单向循环链表

1、概念

        1)循环链表,就是首尾相接的链表

        2)循环链表,就是首尾相接的链表

        3)双向循环链表:需要将最后一个阶段的指针域指向头结点,头结点的前驱指针指向最后一                 个阶段

2、循环链表的创建

        1)创建虚拟链表

// 创建链表
NodePtr list_create()
{// 在堆区申请一个头节点NodePtr L = (NodePtr)malloc(sizeof(Node));if (NULL == L){printf("创建失败\n");return NULL;}L->len = 0;L->next = NULL;L->prio = NULL;printf("链表创建成功\n");return L;
}

        2)判空

// 判空
int list_empty(NodePtr L)
{return L->next == L;
}

        3)申请封装数据

// 申请封装数据
NodePtr apply_node(datatype e)
{NodePtr p = (NodePtr)malloc(sizeof(Node));if (NULL == p){printf("数据类型不合法,封装失败\n");return NULL;}p->data = e;p->next = NULL;return p;
}

        4)按位置查找

// 按位置查找
NodePtr list_search_pos(NodePtr L, datatype pos)
{if (NULL == L || list_empty(L) || pos > L->len || pos < 0){printf("查找失败\n");return NULL;}NodePtr q = L;for (int i = 0; i < pos; i++){q = q->next;}printf("查找成功\n");return q;
}

        5)头插

// 头插
int list_insert_head(NodePtr L, datatype e)
{// 判断逻辑if (NULL == L){printf("插入失败\n");return -1;}NodePtr p = apply_node(e);if (NULL == p){printf("封装失败\n");return -1;}p->next = L->next;L->next = p;L->len++;printf("插入成功\n");return 0;
}

        6)尾插

// 尾插
int list_insert_tail(NodePtr L, datatype e)
{// 判断逻辑if (NULL == L){printf("尾插插入失败\n");return -1;}// 找到最后一个节点NodePtr q = list_search_pos(L, L->len);// 封装节点NodePtr p = apply_node(e);// 插入逻辑p->next = q->next;q->next = p;L->len++;printf("尾插插入成功\n");return 0;
}

        7)头删

//头删
int list_delete_head(NodePtr L)
{if (NULL == L || list_empty(L)){printf("头删失败\n");return -1;}NodePtr p = L->next;L->next = p->next;free(p);p = NULL;L->len--;printf("头删成功\n");return 0;
}

        8)链表删除

// 链表删除
void list_destroy(NodePtr L)
{if (NULL == L ){printf("删除失败\n");return;}while (L->next == L){list_delete_head(L);}free(L);L = NULL;printf("删除成功\n");return ;
}

        9)完整代码

00.h

#ifndef day16_1_flag_h
#define day16_1_flag_h
#include <myhead.h>typedef char datatype;typedef struct Node
{union {int len;datatype data;};struct Node *next;}Node,*NodePtr;NodePtr list_create();int  list_empty(NodePtr L);NodePtr apply_node(datatype e);NodePtr list_search_pos(NodePtr L,datatype pos);int list_insert_tail(NodePtr L,datatype e);int list_insert_head(NodePtr L,datatype e);int list_show(NodePtr L);int list_delete_head(NodePtr L);void list_destroy(NodePtr L);#endif // day16_1_flag_h

00.c

#include "00.h"
#define MAX 50// 创建链表
NodePtr list_create()
{// 在堆区申请一个头节点NodePtr L = (NodePtr)malloc(sizeof(Node));if (NULL == L){printf("创建失败\n");return NULL;}L->len = 0;L->next = L; // 头节点指针域指向自己printf("链表创建成功\n");return L;
}// 判空
int list_empty(NodePtr L)
{return L->next == L;
}// 申请封装数据
NodePtr apply_node(datatype e)
{NodePtr p = (NodePtr)malloc(sizeof(Node));if (NULL == p){printf("数据类型不合法,封装失败\n");return NULL;}p->data = e;p->next = NULL;return p;
}// 按位置查找
NodePtr list_search_pos(NodePtr L, datatype pos)
{if (NULL == L || list_empty(L) || pos > L->len || pos < 0){printf("查找失败\n");return NULL;}NodePtr q = L;for (int i = 0; i < pos; i++){q = q->next;}printf("查找成功\n");return q;
}// 头插
int list_insert_head(NodePtr L, datatype e)
{// 判断逻辑if (NULL == L){printf("插入失败\n");return -1;}NodePtr p = apply_node(e);if (NULL == p){printf("封装失败\n");return -1;}p->next = L->next;L->next = p;L->len++;printf("插入成功\n");return 0;
}// 尾插
int list_insert_tail(NodePtr L, datatype e)
{// 判断逻辑if (NULL == L){printf("尾插插入失败\n");return -1;}// 找到最后一个节点NodePtr q = list_search_pos(L, L->len);// 封装节点NodePtr p = apply_node(e);// 插入逻辑p->next = q->next;q->next = p;L->len++;printf("尾插插入成功\n");return 0;
}//链表遍历
int list_show(NodePtr L)
{if (NULL == L || list_empty(L)){printf("遍历失败\n");return -1;}NodePtr q = L->next;while(q !=L){printf("%c",q->data);q = q->next;}putchar(10);printf("遍历成功\n");return 0;
}//头删
int list_delete_head(NodePtr L)
{if (NULL == L || list_empty(L)){printf("头删失败\n");return -1;}NodePtr p = L->next;L->next = p->next;free(p);p = NULL;L->len--;printf("头删成功\n");return 0;
}// 链表删除
void list_destroy(NodePtr L)
{if (NULL == L ){printf("删除失败\n");return;}while (L->next == L){list_delete_head(L);}free(L);L = NULL;printf("删除成功\n");return ;
}

00main.c

#include "00.h"int main(int argc, char const *argv[])
{NodePtr L = list_create();if (NULL == L ){return -1;}list_insert_head(L,'H');list_show(L);list_insert_head(L,'e');list_show(L);list_insert_head(L,'l');list_show(L);list_insert_head(L,'l');list_show(L);list_insert_head(L,'o');list_show(L);list_insert_tail(L,'Z');list_show(L);list_delete_head(L);list_show(L);list_destroy(L);list_show(L);return 0;
}

        10)约瑟夫环问题

00.h

#ifndef day16_1_flag_h
#define day16_1_flag_h
#include <myhead.h>typedef int datatype;typedef struct Node
{union {int len;datatype data;};struct Node *next;}Node,*NodePtr;NodePtr list_create();int  list_empty(NodePtr L);NodePtr apply_node(datatype e);NodePtr list_search_pos(NodePtr L,datatype pos);int list_insert_tail(NodePtr L,datatype e);int list_insert_head(NodePtr L,datatype e);int list_show(NodePtr L);int list_delete_head(NodePtr L);void list_destroy(NodePtr L);// 任意位置删除
int list_delete_pos(NodePtr L, int pos);//按位置取值
int list_pos_value(NodePtr L,int pos);
#endif // day16_1_flag_h

00.c

#include "00.h"
#define MAX 50// 创建链表
NodePtr list_create()
{// 在堆区申请一个头节点NodePtr L = (NodePtr)malloc(sizeof(Node));if (NULL == L){printf("创建失败\n");return NULL;}L->len = 0;L->next = L; // 头节点指针域指向自己printf("链表创建成功\n");return L;
}// 判空
int list_empty(NodePtr L)
{return L->next == L;
}// 申请封装数据
NodePtr apply_node(datatype e)
{NodePtr p = (NodePtr)malloc(sizeof(Node));if (NULL == p){printf("数据类型不合法,封装失败\n");return NULL;}p->data = e;p->next = NULL;return p;
}// 按位置查找
NodePtr list_search_pos(NodePtr L, datatype pos)
{if (NULL == L || list_empty(L) || pos > L->len || pos < 0){printf("查找失败\n");return NULL;}NodePtr q = L;for (int i = 0; i < pos; i++){q = q->next;}printf("查找成功\n");return q;
}// 头插
int list_insert_head(NodePtr L, datatype e)
{// 判断逻辑if (NULL == L){printf("插入失败\n");return -1;}NodePtr p = apply_node(e);if (NULL == p){printf("封装失败\n");return -1;}p->next = L->next;L->next = p;L->len++;printf("插入成功\n");return 0;
}// 尾插
int list_insert_tail(NodePtr L, datatype e)
{// 判断逻辑if (NULL == L){printf("尾插插入失败\n");return -1;}// 找到最后一个节点NodePtr q = list_search_pos(L, L->len);// 封装节点NodePtr p = apply_node(e);// 插入逻辑p->next = q->next;q->next = p;L->len++;printf("尾插插入成功\n");return 0;
}//链表遍历
int list_show(NodePtr L)
{if (NULL == L || list_empty(L)){printf("遍历失败\n");return -1;}NodePtr q = L->next;while(q !=L){printf("%d\t",q->data);q = q->next;}putchar(10);printf("遍历成功\n");return 0;
}//头删
int list_delete_head(NodePtr L)
{if (NULL == L || list_empty(L)){printf("头删失败\n");return -1;}NodePtr p = L->next;L->next = p->next;free(p);p = NULL;L->len--;printf("头删成功\n");return 0;
}// 链表删除
void list_destroy(NodePtr L)
{if (NULL == L ){printf("删除失败\n");return;}while (L->next == L){list_delete_head(L);}free(L);L = NULL;printf("删除成功\n");return ;
}// 任意位置删除
int list_delete_pos(NodePtr L, int pos)
{if (NULL == L || pos > L->len + 1 || pos < 1){printf("删除失败\n");return -1;}NodePtr q = list_search_pos(L, pos - 1);NodePtr p = q->next;q->next = p->next;free(p);p = NULL;L->len--;printf("删除成功\n");return 0;
}

 00main.c

#include "00.h"int main(int argc, char const *argv[])
{//创建列表NodePtr L = list_create();if (NULL == L){return -1;}//num 人数  die 死亡序号int num, die = 0;printf("输入参与约瑟夫游戏的人数:\n");scanf("%d", &num);printf("报数到多少被杀掉:\n");scanf("%d", &die);//为参与者赋予代号for (int i = 0; i < num; i++){list_insert_head(L, i+1);}list_show(L);//day 日期   all 总人数   death 死者数组int day = 0;int all = num;datatype death[100] = {0};  //死者序列NodePtr p = L;while (num>all/2){for (int i = 0; i < die-1; i++){if (p->next == L)//到头节点时多偏移一位,略过头节点{p = p->next;}p = p->next;}int kill = p->next->data;           //死者代号death[day] = kill;                  //将死者代号存入死者名列printf("%d\n",kill);list_delete_head(p->next);          //删除死者位置day++;                              //日期推移num--;                              //人数减一}printf("死者代号及顺序依次为:\n");for (int i = 0; i < day; i++){printf("%d\t", death[i]);}putchar(10);return 0;
}

双向循环链表

00.h

#ifndef day16_1_flag_h
#define day16_1_flag_h
#include <myhead.h>typedef char datatype;typedef struct Node
{union {int len;datatype data;};struct Node *next;struct Node *prio;}Node,*NodePtr;NodePtr list_create();int  list_empty(NodePtr L);NodePtr apply_node(datatype e);NodePtr list_search_pos(NodePtr L,datatype pos);int list_insert_tail(NodePtr L,datatype e);int list_insert_head(NodePtr L,datatype e);int list_show(NodePtr L);int list_delete_head(NodePtr L);void list_destroy(NodePtr L);// 任意位置删除
int list_delete_pos(NodePtr L, int pos);//按位置取值
int list_pos_value(NodePtr L,int pos);//按位置修改
int list_change_pos(NodePtr L,int pos,datatype e);
#endif // day16_1_flag_h

00.c

#include "00.h"
#define MAX 50// 创建链表
NodePtr list_create()
{// 在堆区申请一个头节点NodePtr L = (NodePtr)malloc(sizeof(Node));if (NULL == L){printf("创建失败\n");return NULL;}L->len = 0;L->next = L; // 头节点指针域指向自己L->prio = L;printf("链表创建成功\n");return L;
}// 判空
int list_empty(NodePtr L)
{return L->next == L;
}// 申请封装数据
NodePtr apply_node(datatype e)
{NodePtr p = (NodePtr)malloc(sizeof(Node));if (NULL == p){printf("数据类型不合法,封装失败\n");return NULL;}p->data = e;p->next = NULL;p->prio = NULL;return p;
}// 按位置查找
NodePtr list_search_pos(NodePtr L, datatype pos)
{if (NULL == L || list_empty(L) || pos > L->len || pos < 0){printf("查找失败\n");return NULL;}NodePtr q = L;for (int i = 0; i < pos; i++){q = q->next;}printf("查找成功\n");return q;
}// 头插
int list_insert_head(NodePtr L, datatype e)
{if (NULL == L){printf("数据类型不合法,头插失败\n");return -1;}NodePtr p = apply_node(e);if (NULL == p){printf("数据封装失败,头插失败\n");return -1;}if (list_empty(L)){p->prio = L;p->next = L->next; // p->next = LL->next = p;L->prio = p;}else{p->prio = L;p->next = L->next;L->next->prio = p; // p->next->prio =p;L->next = p;}L->len++;printf("插入成功\n");return 0;
}// 尾插
int list_insert_tail(NodePtr L, datatype e)
{// 判断逻辑if (NULL == L){printf("尾插插入失败\n");return -1;}// 找到最后一个节点NodePtr q = list_search_pos(L, L->len);// 封装节点NodePtr p = apply_node(e);// 插入逻辑p->next = q->next;p->prio = q;q->next = p;L->len++;printf("尾插插入成功\n");return 0;
}// 链表遍历
int list_show(NodePtr L)
{if (NULL == L || list_empty(L)){printf("遍历失败\n");return -1;}NodePtr q = L->next;while (q != L){printf("%c", q->data);q = q->next;}putchar(10);printf("遍历成功\n");return 0;
}// 头删
int list_delete_head(NodePtr L)
{if (NULL == L || list_empty(L)){printf("头删失败\n");return -1;}NodePtr p = L->next;L->next = p->next;p->next->prio = L;free(p);p = NULL;L->len--;printf("头删成功\n");return 0;
}// 链表删除
void list_destroy(NodePtr L)
{if (NULL == L){printf("删除失败\n");return;}while (L->next == L){list_delete_head(L);}free(L);L = NULL;printf("删除成功\n");return;
}// 任意位置删除
int list_delete_pos(NodePtr L, int pos)
{if (NULL == L || pos > L->len + 1 || pos < 1){printf("删除失败\n");return -1;}NodePtr q = list_search_pos(L, pos - 1);NodePtr p = q->next;q->next = p->next;p->next->prio = q;free(p);p = NULL;// NodePtr p = L->next;// L->next = p->next;// p->next->prio = L;// free(p);// p = NULL;L->len--;printf("按位置删除成功\n");return 0;
}//按位置修改
int list_change_pos(NodePtr L,int pos,datatype e)
{if (NULL == L || pos > L->len + 1 || pos < 1){printf("修改失败\n");return -1;}NodePtr q = list_search_pos(L, pos);q->data = e;printf("按位置修改成功\n");return 0;
}
#include "00.h"int main(int argc, char const *argv[])
{NodePtr L = list_create();if (NULL == L ){return -1;}putchar(10);list_insert_head(L,'H');list_insert_head(L,'e');list_insert_head(L,'l');list_insert_head(L,'l');list_insert_head(L,'o');list_show(L);putchar(10);list_insert_tail(L,'Z');list_show(L);putchar(10);list_delete_head(L);list_show(L);putchar(10);list_delete_pos(L,3);list_show(L);putchar(10);list_change_pos(L,4,'A');list_show(L);putchar(10);list_destroy(L);list_show(L);putchar(10);return 0;
}

实现结果

相关文章:

学习记录day16—— 数据结构 双向链表 循环链表

双向链表 1、概念 1&#xff09;就是从任意一个节点既能存储其前驱节点&#xff0c;又能存储后继节点 2)结构体中增加一个指向前驱节点的指针 //定义数据类型 typedef int datatype;//定义节点类型 typedef struct Node {union {int len;datatype data;};struct Node *prio; …...

Air780EP模块 AT开发-MQTT接入OneNET移动物联网平台应用指南

应用概述 使用AT方式通过MQTT协议连接onenet studio。官网地址&#xff1a;https://open.iot.10086.cn/ 材料准备 Air780EP(V)开发板一套&#xff0c;包括天线SIM卡&#xff0c;USB线。 PC电脑&#xff0c;串口工具 在onenet上创建产品 打开OneNET官网&#xff0c;进入控制…...

HOST处理器预读PCI设备

在PCI&#xff08;Peripheral Component Interconnect&#xff09;总线规范中&#xff0c;MRL&#xff08;Memory Read Line&#xff09;和MRM&#xff08;Memory Read Multiple&#xff09;是两种读取存储器地址空间的总线事务类型。 MRL&#xff08;Memory Read Line&#xf…...

【Ansible】通过role角色部署lnmp架构

目录 一.roles概述 1.roles角色 2.roles的目录层次 2.1.roles 内各目录含义解释 二.实操 1.部署nginx 2.部署MySQL 3.部署php 4.编写测试文件 三.总结 一.roles概述 1.roles角色 可以把playbook剧本里的每个play看作为一个角色&#xff0c;将每个角色要用到的文件、…...

springboot给属性赋值的两种方式(yaml与properties)

一&#xff0c;介绍 在Spring Boot中&#xff0c;配置文件是用来设置应用程序的各种参数和操作模式的重要部分。Spring Boot支持两种主要类型的配置文件&#xff1a;properties文件和YAML 文件。这两种文件都可以用来定义相同的配置&#xff0c;但它们在格式和表达能力上有所不…...

20240725 每日AI必读资讯

&#x1f680;最强开源模型来了!Llama3.1以405B参数领先GPT-4o - Llama3.1以405B参数领先GPT-4o和Claude3.5Sonnet&#xff0c;在性能上实现超越。 - Meta大幅优化训练栈&#xff0c;扩展模型算力规模至16000个H100GPU&#xff0c;提高性能。 - Llama3.1具有上下文长度扩展、…...

17_高级进程间通信 UNIX域套接字1

非命名的UNIX域套接字 第1个参数domain&#xff0c;表示协议族&#xff0c;只能为AF_LOCAL或者AF_UNIX&#xff1b; 第2个参数type&#xff0c;表示类型&#xff0c;只能为0。 第3个参数protocol&#xff0c;表示协议&#xff0c;可以是SOCK_STREAM或者SOCK_DGRAM。用SOCK_STR…...

大型语言模型的生物医学知识图优化提示生成

大型语言模型的生物医学知识图优化提示生成 https://arxiv.org/abs/2311.17330 https://github.com/BaranziniLab/KG_RAG 大型语言模型的生物医学知识图优化提示生成 摘要 KG-RAG框架&#xff0c;较好的结合了生物医学知识图谱SPOKE和LLM的优势。SPOKE是一个开放知识图谱&…...

winform datagrid 全部勾选

如果我们想要进行全选或全部取消&#xff0c;在数据较多的情况下&#xff0c;这种方法显然特别繁琐。怎么办呢&#xff1f; 当然是加以一个全选按钮了&#xff0c;选中全选按钮则全选&#xff0c;否则取消。笔者本想在红色圆圈位置添加全选复选框的&#xff0c;那样看起来更加…...

从 NextJS SSRF 漏洞看 Host 头滥用所带来的危害

前言 本篇博文主要内容是通过代码审计以及场景复现一个 NextJS 的安全漏洞&#xff08;CVE-2024-34351&#xff09;来讲述滥用 Host 头的危害。 严正声明&#xff1a;本博文所讨论的技术仅用于研究学习&#xff0c;旨在增强读者的信息安全意识&#xff0c;提高信息安全防护技能…...

LC617-合并二叉树

文章目录 1 题目描述2 思路优化代码完整输入输出 参考 1 题目描述 https://leetcode.cn/problems/merge-two-binary-trees/description/ 给你两棵二叉树&#xff1a; root1 和 root2 。 将其中一棵覆盖到另一棵之上时&#xff0c;两棵树上的一些节点将会重叠&#xff08;而另…...

深入解析:端到端目标检测模型的奥秘

深入解析&#xff1a;端到端目标检测模型的奥秘 在人工智能领域&#xff0c;计算机视觉任务一直是研究的热点之一。目标检测作为计算机视觉中的核心问题&#xff0c;其重要性不言而喻。端到端的目标检测模型&#xff0c;以其高效的性能和简洁的架构&#xff0c;逐渐成为研究和…...

xmind--如何快速将Excel表中多列数据,复制到XMind分成多级主题

每次要将表格中的数据分成多级时&#xff0c;只能复制粘贴吗 快来试试这个简易的方法吧 这个是原始的表格&#xff0c;分成了4级 步骤&#xff1a; 1、我们可以先按照这个层级设置下空列&#xff08;后买你会用到这个空列&#xff09; 二级不用加、三级前面加一列、四级前面加…...

在 Android 上实现语音命令识别:详细指南

在 Android 上实现语音命令识别:详细指南 语音命令识别在现代 Android 应用中变得越来越普遍。它允许用户通过自然语言与设备进行交互,从而提升用户体验。本文将详细介绍如何在 Android 上实现语音命令识别,包括基本实现、带有占位槽位的命令处理,以及相关的配置和调试步骤…...

怎么理解FPGA的查找表与CPLD的乘积项

怎么理解 fpga的查找表 与cpld的乘积项 FPGA&#xff08;现场可编程门阵列&#xff09;和CPLD&#xff08;复杂可编程逻辑器件&#xff09;是两种常见的数字逻辑器件&#xff0c;它们在内部架构和工作原理上有着一些显著的区别。理解FPGA的查找表&#xff08;LUT&#xff0c;L…...

51.2T 800G 以太网交换机,赋能AI开放生态

IB与以太之争 以太网替代IB趋势明显。据相关报告&#xff1a;2024年TOP500的超算中&#xff0c;采用以太网方案占比48.5%&#xff0c;InfiniBand占比为39.2%&#xff0c;其中排名前6的超算中已有5个使用以太网互联。 开放系统战胜封闭系统仅是时间问题。我们已经看到&#xf…...

【制作100个unity游戏之31】用unity制作一个爬坡2d赛车小游戏

最终效果 【制作100个unity游戏之31】用unity制作一个爬坡2d赛车小游戏 前言 今天用unity制作一个简单的爬坡2d赛车小游戏 素材 https://www.spriters-resource.com/mobile/hillclimbracing/ 拼装车素材 车身添加碰撞体&#xff0c;摩檫力0 轮胎添加碰撞体和刚体&#xff0…...

Spring Boot 注解 @PostConstruct 介绍

Spring Boot 注解 PostConstruct 介绍 文章目录 Spring Boot 注解 PostConstruct 介绍一、基本介绍二、PostConstruct 的执行时机Spring Bean 的生命周期PostConstruct 的确切执行时机执行顺序示例重要注意事项 三、使用场景及代码示例1. 初始化资源&#xff1a;比如打开数据库…...

深度学习环境配置报错解决日记

2024年7越24日 1、detectron2需要编译 首先需要在自己创建的虚拟环境中下载一下detectron2 conda create -n pytorch python3.9 conda activate pythorch git clone https://github.com/facebookresearch/detectron2.git 接下来就是编译环节&#xff1a; 在win系统中&…...

百度,有道,谷歌翻译API

API翻译 百度&#xff0c;有道&#xff0c;谷歌API翻译&#xff08;只针对中英相互翻译&#xff09;,其他语言翻译需要对应from&#xff0c;to的code 百度翻译 package fills.tools.translate; import java.util.ArrayList; import java.util.HashMap; import java.util.Lis…...

java-双亲委派机制

Java虚拟机&#xff08;JVM&#xff09;中的类加载器&#xff08;Class Loader&#xff09;负责将类&#xff08;.class文件&#xff09;加载到JVM中&#xff0c;以便Java程序能够使用这些类。在JVM中&#xff0c;类加载器被组织成一种层次结构关系&#xff0c;这种层次结构关系…...

【C++】set的使用

&#x1f525;个人主页&#xff1a; Forcible Bug Maker &#x1f525;专栏&#xff1a; STL || C 目录 &#x1f308;前言&#x1f308;关于set&#x1f525;容量函数emptysize &#x1f525;Modifiersinserteraseclear &#x1f525;Operationsfindcountlower_bound和upper_…...

React 18【实用教程】(2024最新版)

搭建开发环境 含配置&#xff0c;react-developer-tools 和 Redux DevTools 下载安装 https://blog.csdn.net/weixin_41192489/article/details/138523829 JSX 语法 https://blog.csdn.net/weixin_41192489/article/details/138649165 组件 父子组件传值、兄弟组件传值、越层组…...

Perl语言入门学习指南

Perl语言&#xff08;Practical Extraction and Report Language&#xff09;是一种强大的脚本语言&#xff0c;以其灵活性和强大的文本处理能力而闻名。Perl广泛应用于系统管理、Web开发、网络编程和数据处理等领域。本文将带您入门Perl语言&#xff0c;介绍其基本语法、常用功…...

《Java8函数式编程》学习笔记汇总

前言 见证了java8的多层排序&#xff0c;为此想系统学习下java8的用法。 目录 简介Lambda表达式流高级集合类和收集器数据并行化测试、调试和重构设计和架构的原则使用Lambda表达式编写并发程序下一步改怎么办 后记...

C语言之封装,继承,多态

本文参考&#xff1a; c语言面向对象之封装c面向对象之继承Linux源码分析之多态 一、封装 封装的本质就是将数据和方法集中到一个对象中&#xff0c;c或者java使用的是class来实现。c语言中可以使用struct来实现同样的功能。比如下面的程序&#xff1a; struct student {int…...

GO内存分配详解

文章目录 GO内存分配详解一. 物理内存(Physical Memory)和虚拟内存(Virtual Memory)二. 内存分配器三. TCMalloc线程内存(thread memory)页堆(page heap)四. Go内存分配器mspanmcachemcentralmheap五. 对象分配流程六. Go虚拟内存ArenaGO内存分配详解 这篇文章中我将抽丝剥茧,…...

每日Attention学习12——Exterior Contextual-Relation Module

模块出处 [ISBI 22] [link] [code] Duplex Contextual Relation Network for Polyp Segmentation 模块名称 Exterior Contextual-Relation Module (ECRM) 模块作用 内存型特征增强模块 模块结构 模块思想 原文表述&#xff1a;在临床环境中&#xff0c;不同样本之间存在息肉…...

为什么现在电销公司这么难?

现在电销公司普遍底薪就4000&#xff0c;员工要干的工作&#xff1a; 1、自己办卡、现在大部分人对隐私方面比较在意&#xff0c;一般电销公司还都需要自己身份证实名办卡&#xff0c;打几天又封号&#xff0c;有的人甚至被移动拉黑 2、天天打电话&#xff0c;遇见的什么人都…...

每天一个数据分析题(四百四十二)- 标签与指标

数据分析师在工作中常常会涉及两个概念&#xff1a;标签、指标&#xff0c;下面关于标签与指标的描述正确的是&#xff08;&#xff09;&#xff1f; A. 指标通常可以量化&#xff0c;但是标签一般是不可量化的 B. 标签是用来定义、评价和描述特定事物的一种标准或方式 C. 指…...

[论文笔记] pai-megatron-patch Qwen2-72B/7B/1.5B 长文本探路

[论文笔记] Pai-megatron-patch cpu-offload 改到 Qwen2-CSDN博客 Pai-Megatron-Patch (mcore代码) 长文本限制: 开SP之后,72B能开到16K,7B能开到32K。 但是72B开16K,或者7B开32K时,如果训练时训练样本中有长文本的话,则还是会OOM。 code: 相对于原repo加了一些代…...

【SpringCloud】微服务远程调用OpenFeign

工作原理流程图 上代码 common中添加依赖&#xff1a; <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> <dependency><groupId>org.spri…...

MySQL零散拾遗(四)

聚合函数 聚合函数作用于一组数据&#xff0c;并对一组数据返回一个值。 常见的聚合函数&#xff1a;SUM()、MAX()、MIN()、AVG()、COUNT() 对COUNT()聚合函数的更深一层理解 COUNT函数的作用&#xff1a;计算指定字段在查询结果中出现的个数&#xff08;不包含NULL值&#…...

大语言模型-检索测评指标

1. MRR &#xff08;Mean Reciprocal Rank&#xff09;平均倒数排名&#xff1a; 衡量检索结果排序质量的指标。 计算方式&#xff1a; 对于每个查询&#xff0c;计算被正确检索的文档的最高排名的倒数的平均值&#xff0c;再对所有查询的平均值取均值。 意义&#xff1a; 衡量…...

Zookeeper集群中节点之间数据是如何同步的

1.首先集群启动时&#xff0c;会先进行领导者选举&#xff0c;确定哪个节点是Leader&#xff0c;哪些节点是Follower和Observer 2.然后Leader会和其他节点进行数据同步&#xff0c;采用发送快照和发送Diff日志的方式 3.集群在工作过程中&#xff0c;所有的写请求都会交给Lead…...

HTTPServer改进思路2(mudou库核心思想融入)

mudou网络库思想理解 Reactor与多线程 服务器构建过程中&#xff0c;不仅仅使用一个Reactor&#xff0c;而是使用多个Reactor&#xff0c;每个Reactor执行自己专属的任务&#xff0c;从而提高响应效率。 首先Reactor是一种事件驱动处理模式&#xff0c;其主要通过IO多路复用…...

Kubernetes Secret 详解

Kubernetes Secret 是一种用于存储和管理敏感信息的对象,如密码、OAuth 令牌和 SSH 密钥等。使用 Secret 可以避免将机密数据直接放在 Pod 规约或容器镜像中,从而增加了应用程序的安全性。 Secret 的类型 Kubernetes 支持多种类型的 Secret,包括: ​​Opaque​​:默认的…...

docker笔记4-部署

docker笔记4-部署 一、部署nginx二、部署Tomcat三、部署ESKibana3.1 部署ES3.2 部署kibana 一、部署nginx docker search nginx #搜索nginx的最新版本docker pull nginx #这里可以指定nginx版本&#xff0c;如果不指定&#xff0c;那么就拉取最新版本latestdocker run -d --na…...

有监督学习基础

基本概念 给定输入有为&#xff08;x,y&#xff09;&#xff0c;其中x表示学习特征&#xff0c;y表示输出&#xff0c;m表示输入总数&#xff0c;有监督学习旨在根据输入建立能够预测可能输出的模型&#xff0c;大致可以分为回归和分类两种&#xff0c;代表可能输出是无限的或…...

揭开 AI 绘画提示词的神秘密码!

前言 ** 揭秘AI 绘画 ** 提示词的神秘密码 亲爱的朋友们&#xff0c;今天我们要一起探索 AI 绘画世界中那神秘的“密码”——提示词。 在 AI 绘画的奇妙领域里&#xff0c;提示词就像是一把神奇的钥匙&#xff0c;能够开启无尽的创意之门。它是我们与 AI 进行心灵对话的桥…...

macOS 10.15中屏蔽Microsoft Edge浏览器的更新提示

文章目录 1.效果对比2.安装描述文件3.停用描述文件4.高级操作&#xff08;可选&#xff09;参考文献 最近在macOS10.15系统&#xff0c;打开Microsoft Edge浏览器&#xff0c;每次打开都有个烦人的提示“ 要获取将来的 microsoft edge 更新&#xff0c;需要 macos 10.15 或更高…...

Qt 实战(3)数据类型 | 3.2、QVariant

文章目录 一、QVariant1、存储数据1.1、存储Qt内置数据1.2、存储自定义数据 2、获取数据3、判断数据类型4、清空数据5、总结 前言&#xff1a; QVariant是Qt框架中一个非常强大且灵活的类&#xff0c;它提供了一种通用的方式来存储和转换几乎任何类型的数据。无论是基本数据类型…...

Docker中安装的postgresql14在启用vector扩展的时候,找不到该扩展的控制文件。

ERROR: could not open extension control file “/usr/share/postgresql/14/extension/vector.control”: No such file or directory 进入容器 docker exec -it CONTAINER ID /bin/bash 1.更新 apt-get apt-get update 2.安装插件 #不同版本对应修改数字即可 apt-get i…...

JS防抖和节流

一、防抖和节流的适用场景 防抖&#xff08;Debounce&#xff09;&#xff1a; 适合在输入框输入时的实时搜索、窗口大小调整时的resize事件等。节流&#xff08;Throttle&#xff09;&#xff1a; 适合如页面滚动时的scroll事件、按钮点击时的请求发送等需要控制频率的场景。 …...

OpenWrt 为软件包和docker空间扩容

参考资料 【openwrt折腾日记】解决openwrt固件刷入后磁盘空间默认小的问题&#xff0c;关联openwrt磁盘扩容空间扩容【openwrt分区扩容】轻松解决空间可用不足的尴尬丨老李一瓶奶油的YouTube 划分空间 参考一瓶奶油的YouTube 系统 -> 磁盘管理 -> 磁盘 -> 修改 格…...

重要的工作任务,怎么在电脑桌面设置倒计时?

在日常工作中&#xff0c;我们总是面临着众多工作任务&#xff0c;如何高效地管理和完成这些任务成为了每个职场人的必备技能。为任务设置倒计时&#xff0c;不仅能让我们清晰地看到任务的先后顺序&#xff0c;还能帮助我们更好地把握时间&#xff0c;提高工作效率。想象一下&a…...

Failed to build get_cli:get:的解决方案

项目场景&#xff1a; 今天安装Getx命令行的时候&#xff0c;输入这面文档报了一个错&#xff1a; dart pub global activate get_cli 问题描述 提示&#xff1a;这里描述项目中遇到的问题&#xff1a; 例如&#xff1a;数据传输过程中数据不时出现丢失的情况&#xff0c;偶尔…...

短视频矩阵源码技术分享

在当今数字媒体时代&#xff0c;短视频已成为吸引观众和传递信息的重要手段。对于开发者而言&#xff0c;掌握短视频矩阵源码技术不仅是提升自身技能的需要&#xff0c;更是把握行业发展趋势的必然选择。本文将深入探讨短视频矩阵源码的关键技术要点及其实现方法&#xff0c;帮…...

轮播图自定义内容

官网&#xff1a;Swiper演示 - Swiper中文网 下载&#xff1a; npm i swiper Vue3示例代码&#xff1a; <template><div class"swiper mySwiper"><div class"swiper-wrapper"><div class"swiper-slide"><div>…...

大数据-44 Redis 慢查询日志 监视器 慢查询测试学习

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…...