循环双链表算法库构建

学习贺老师数据结构数据结构之自建算法库——循环双链表_数据结构编写一个程序linklist.cpp-CSDN博客

模仿单链表逻辑,实现双链表, 大差不差

v1.0: 实现基本功能

V1.0

1.主要功能:

//(1)头插法建立循环双链表
void Create_Double_CyclicList_Head(DoubleLinkList_Cyclic *&L,ElemType Array_used[],int Array_number);
//(2)尾插法建立双链表
void Create_Double_CyclicList_Tail(DoubleLinkList_Cyclic *&L,ElemType Array_used[],int Array_number);
//(3)输出循环双链表
void Display_Double_CyclicList(DoubleLinkList_Cyclic *L);
//(4)初始化循环双链表
void Init_Double_CyclicList(DoubleLinkList_Cyclic *&L);
//(5)销毁循环双链表
void Destroy_Double_CyclicList(DoubleLinkList_Cyclic *&L);
//(6)判断循环双链表是否为空
bool  Empty_Double_CyclicList(DoubleLinkList_Cyclic *L);
//(7)求循环双链表数据元素个数(不包括头结点)
int Length_Double_CyclicList(DoubleLinkList_Cyclic *L);

//(8) 查找特定元素值,在循环双链表中的位置
int SpecificValue_Location_Double_CyclicList(DoubleLinkList_Cyclic *L, ElemType specific_value);

//(9) 取出循环双链表中 特定位置的元素值
bool SpecificLocate_Value_Double_CyclicList(DoubleLinkList_Cyclic *L, int specific_locate,ElemType &get_value);

//(10) 把特定的节点值, 插入到循环双链表特定位置
bool InsertElement_Double_CyclicList(DoubleLinkList_Cyclic *&L, int specific_locate, ElemType insert_value);
//(11) 删除特定位置的节点值
bool Delete_SpecificLocate_Double_CyclicList(DoubleLinkList_Cyclic *&L, int specific_locate, ElemType &delete_value);


2. 循环双链表头文件

Cyclic_DoubleLinkList.h

#ifndef CYCLIC_DOUBLELINKLIST_H_INCLUDED
#define CYCLIC_DOUBLELINKLIST_H_INCLUDED

#include <stdio.h>
#include <malloc.h>

typedef int ElemType;

//循环双链表基本运算函数
typedef struct  Double_Cyclic_Node  //定义循环双链表节点类型
{
    ElemType data;
    struct Double_Cyclic_Node *prior;//指向前驱节点
    struct Double_Cyclic_Node *next; //指向后继节点

}DoubleLinkList_Cyclic;


//(1)头插法建立循环双链表
void Create_Double_CyclicList_Head(DoubleLinkList_Cyclic *&L,ElemType Array_used[],int Array_number);
//(2)尾插法建立双链表
void Create_Double_CyclicList_Tail(DoubleLinkList_Cyclic *&L,ElemType Array_used[],int Array_number);
//(3)输出循环双链表
void Display_Double_CyclicList(DoubleLinkList_Cyclic *L);
//(4)初始化循环双链表
void Init_Double_CyclicList(DoubleLinkList_Cyclic *&L);
//(5)销毁循环双链表
void Destroy_Double_CyclicList(DoubleLinkList_Cyclic *&L);
//(6)判断循环双链表是否为空
bool  Empty_Double_CyclicList(DoubleLinkList_Cyclic *L);
//(7)求循环双链表数据元素个数(不包括头结点)
int Length_Double_CyclicList(DoubleLinkList_Cyclic *L);

//(8) 查找特定元素值,在循环双链表中的位置
int SpecificValue_Location_Double_CyclicList(DoubleLinkList_Cyclic *L, ElemType specific_value);

//(9) 取出循环双链表中 特定位置的元素值
bool SpecificLocate_Value_Double_CyclicList(DoubleLinkList_Cyclic *L, int specific_locate,ElemType &get_value);

//(10) 把特定的节点值, 插入到循环双链表特定位置
bool InsertElement_Double_CyclicList(DoubleLinkList_Cyclic *&L, int specific_locate, ElemType insert_value);
//(11) 删除特定位置的节点值
bool Delete_SpecificLocate_Double_CyclicList(DoubleLinkList_Cyclic *&L, int specific_locate, ElemType &delete_value);

#endif // CYCLIC_DOUBLELINKLIST_H_INCLUDED


3. 循环双链表库函数

 Cyclic_DoubleLinkList.cpp

#include "Cyclic_DoubleLinkList.h"

/**************************************************
(1)函数名: Create_Double_CyclicList_Head
功  能: 头插法建立循环双链表
参  数: (1)DoubleLinkList_Cyclic *&L: 要建立并传回去的循环双链表指针地址
        (2)ElemType Array_used[]: 要使用的数组数据
        (3)int Array_number: 数组的长度
注 意: ①我们是按照双链表方法建立,最后找到尾指针,再形成闭环
思 路:  (1)创建头结点(2)头结点置空(3)根据数据创建新节点,并利用头插法插入(4)查找尾结点(5)形成闭环
返回值: 无
**************************************************/

void Create_Double_CyclicList_Head(DoubleLinkList_Cyclic *&L,ElemType Array_used[],int Array_number)
{
    int counter;
    DoubleLinkList_Cyclic *newnode,*tailnode;
    L = (DoubleLinkList_Cyclic*)malloc(sizeof(DoubleLinkList_Cyclic)); //创建头结点
    L->next = NULL;
    for(counter = 0; counter < Array_number; counter++)
    {
        newnode = (DoubleLinkList_Cyclic*)malloc(sizeof(DoubleLinkList_Cyclic));  //创建新节点
        newnode->data = Array_used[counter];
        //将newnode插在原开始结点之前,头结点之后
        newnode->next = L->next;
        if(L->next != NULL)
        {
            L->next->prior = newnode;
        }
        //解决新节点和头结点之间的链接
        L->next = newnode;
        newnode->prior = L;
    }
    tailnode = L;
    while(tailnode->next != NULL) //①查找尾结点, 从而将其指向头结点
    {
        tailnode = tailnode->next;
    }
    tailnode->next = L;         // 尾结点的next域指向头结点
    L->prior = tailnode;        //头结点的prior域指向尾结点形成闭环
}

/**************************************************
(2)函数名: Create_CyclicList_Tail
功  能: 尾插法建立双链表
参  数: (1)DoubleLinkList_Cyclic *&L: 要建立并传回去的循环双链表指针地址
        (2)ElemType Array_used[]: 要使用的数组数据
        (3)int Array_number: 数组的长度
注 意:   我们是按照双链表建立的方法进行建立,最后尾指针指向头结点即可
思 路:   (1)定义新节点,尾指针节点,数组遍历序号
        (2)创建头结点,并置空后继指针
        (3)按照数组顺序,新建节点,并利用尾插法插入链表尾部
        (4)插入完成,尾指针指向头结点
返回值:   无
**************************************************/
void Create_Double_CyclicList_Tail(DoubleLinkList_Cyclic *&L,ElemType Array_used[],int Array_number)
{
    int counter;
    DoubleLinkList_Cyclic *newNode,*tailNode;
    L = (DoubleLinkList_Cyclic*)malloc(sizeof(DoubleLinkList_Cyclic));
    L->next = NULL; //末尾再构建循环链表
    tailNode = L;
    for(counter = 0; counter < Array_number; counter++)
    {
        newNode = (DoubleLinkList_Cyclic*)malloc(sizeof(DoubleLinkList_Cyclic));
        newNode->data = Array_used[counter];

        tailNode->next = newNode;   //尾结点已经是末尾,目前不用考虑后继,最后再考虑
        newNode->prior = tailNode;

        tailNode = newNode;         //尾结点后移
    }
    tailNode->next = L;             //构建循环双链表
    L->prior = tailNode;
}

/**************************************************
(3)函数名: Display_CyclicList
功  能: 输出展示循环双链表
参  数:(1)DoubleLinkList_Cyclic *L:要展示的循环双链表
注 意:①因为是循环双链表,所以结束条件是, 指针指向头结点
思 路:  (1)定义遍历节点(2)判断是否为空(L == L->next)(3)从数据节点开始遍历输出(4)不结束接着遍历输出
返回值: 无
**************************************************/
void Display_Double_CyclicList(DoubleLinkList_Cyclic *L)
{
    DoubleLinkList_Cyclic *showNode;
    showNode = L->next;
    if(showNode == L)
    {
        printf("Hey, it it Empty!\n");
    }
    while(showNode != L) //①
    {
        printf("%d",showNode->data);
        printf(" ");
        showNode = showNode->next;
    }
    printf("\n");
}


/**************************************************
(4)函数名: Init_CyclicList
功  能: 初始化循环双链表
参  数: DoubleLinkList_Cyclic *&L:要初始化的循环双链表指针地址
返回值: 无
**************************************************/
void Init_Double_CyclicList(DoubleLinkList_Cyclic *&L)
{
    L = (DoubleLinkList_Cyclic*)malloc(sizeof(DoubleLinkList_Cyclic));
    L->next = L;//初始化头结点前驱和后继指针指向自己
    L->prior = L;
}

/**************************************************
(5)函数名: Destroy_CyclicList
功  能: 释放循环双链表的节点空间,
参  数: DoubleLinkList_Cyclic *&L:要销毁的循环双链表
注 意: ①防止野指针被函数利用后, 飘飞
        ②防止遍历指针信息被删除后,找不到后继信息
        ③循环双链表,结束条件是 尾指针指向头结点
思 路:   (1)定义遍历指针和后继指针(2)规划好nowNode和backNode关系
        (3) nowNode遍历删除,backNode后移,直到backNode == L,退出
        (4)接着释放nowNode,并且防止野指针飘飞,①
返回值:  无
**************************************************/
void Destroy_Double_CyclicList(DoubleLinkList_Cyclic *&L)
{
    DoubleLinkList_Cyclic *nowNode;
    DoubleLinkList_Cyclic *backNode;     //②
    nowNode = L;
    backNode = nowNode->next;
    while(backNode != L)          //③
    {
        free(nowNode);
        nowNode = backNode;
        backNode = backNode->next;
    }
    free(nowNode);
    L->next = L->prior = L; //①防止被滥用后,野指针飘飞

}

/**************************************************
(6)函数名: Empty_CyclicList
功  能: 判断循环双链表是否为空
参  数: DoubleLinkList_Cyclic *L:要参与判断的循环双链表
返回值: bool:是否为空? true:false
**************************************************/
bool  Empty_Double_CyclicList(DoubleLinkList_Cyclic *L)
{
    return (L->next == L && L->prior == L);
}

/**************************************************
(7)函数名: Length_CyclicList
功  能: 求循环双链表数据元素个数(不包括头结点)
参  数: DoubleLinkList_Cyclic *L :要参与计算的循环双链表
注  意: ① 结束条件:尾指针指向头结点
返回值:  int: 循环双链表数据元素个数
**************************************************/
int Length_Double_CyclicList(DoubleLinkList_Cyclic *L)
{
    int counter = 0;
    DoubleLinkList_Cyclic *nowNode = L;
    while(nowNode->next != L)       //①
    {
        counter++;
        nowNode = nowNode->next;
    }
    return counter;
}


/**************************************************
(8)函数名:SpecificValue_Location_CyclicList
功  能:找特定元素值,在循环双链表中的位置
参  数:(1)DoubleLinkList_Cyclic *L:  需要查找的循环双链表
       (2)ElemType specific_value:   要查找的元素值
注 意: ① 从 L->next开始,即第一个数据元素开始查找,其位置counter伴随
       ②跳出有两种情况:1,找到 2,超范围指向头结点
返回值: int: 返回特定元素值的 位置(0:未找到 , 1~n: 找到)
**************************************************/
int SpecificValue_Location_Double_CyclicList(DoubleLinkList_Cyclic *L, ElemType specific_value)
{
    int counter = 1;
    DoubleLinkList_Cyclic *nowNode = L->next;      //①
    while((nowNode != L) && (nowNode->data != specific_value))
    {
        counter++;
        nowNode = nowNode->next;
    }
    if(nowNode == L)    //②如果指向头结点,则未找到
    {
        return 0;
    }
    else
    {
        return counter;
    }

}

/**************************************************
(9)函数名:SpecificLocate_Value_CyclicList
功  能:取出循环双链表中 特定位置的元素值
参  数:(1)DoubleLinkList_Cyclic *L: 要进行遍历查找的循环双链表
       (2)int specific_locate: 要定位的特定位置
       (3)ElemType &get_value: 传回对应的节点数据
注  意:①循环链表,超范围条件是nowNode = L,如果从头开始,nowNode = L,counter = 0,就会默认到头
        所以从第 L->next开始算,
      ② 从① 开始算的前提是,L有后继节点,也就是L不是空表
      ③ L不是空表, 但是所给位置,超出循环链表长度,仍返回错误
      ④ ②和③其实可以归为一类,都是长度不足,但是为了做区分, 分开了
思  路:(1)定义当前节点和位置序号  (2)从第一个数据节点开始
        (3) 空表直接跳出          (4)通过对比位置信息 和 检测 节点循环链表是否超范围
        (5)传回特定位置信息  或者 超范围标志false
返回值:  bool: 是否找到特定位置,并传回节点数据? true:false
**************************************************/
bool SpecificLocate_Value_Double_CyclicList(DoubleLinkList_Cyclic *L, int specific_locate,ElemType &get_value)
{
    int counter = 1;
    bool result;
    DoubleLinkList_Cyclic *nowNode;
    nowNode = L->next;//①从第一个节点开始遍历查找
    if(nowNode == L || specific_locate <= 0) //②空表和非法性判断
    {
        result == false;
        printf("Empty table or illegal location !");
    }
    else
    {
        while(counter < specific_locate && nowNode != L)
        {
            counter++;
            nowNode = nowNode->next;
        }
        if(nowNode == L)   //③
        {
            result = false;
            printf("Length overrun!\n");
        }
        else
        {
            get_value = nowNode->data;
            result = true;
        }
    }
    return result;

}

/**************************************************
(10)函数名: InsertElement_CyclicList
功  能:特定的节点值,插入到循环双链表特定位置
参  数:(1)DoubleLinkList_Cyclic *&L:要插入的循环双链表
        (2)int specific_locate: 要插入的特定位置
        (3)ElemType insert_value: 要插入的特定值
思  路: (1)定义遍历节点nowNode,新节点newNode   (2)从头开始遍历,到特定位置
        (3) 不管是否为空表,第一个位置都可以插入成功,单独摘出
        (4)  后续遍历nowNode从 nowNode = L->next开始,只能插入到第2~n个位置
        (5)  查找第(specific_locate-1 )个位置{是否超范围? true:false},将新节点插入其后
        (6)返回成功
注  意:  ①因为我们 判断nowNode是否结束, 是直接判断 nowNode ?= L, 所以初始不能 nowNode = L
返回值:  bool:插入是否成功? true:false
**************************************************/
bool InsertElement_Double_CyclicList(DoubleLinkList_Cyclic *&L, int specific_locate, ElemType insert_value)
{
    int counter;
    bool result;
    DoubleLinkList_Cyclic *nowNode,*newNode;
    nowNode = L;
    //(3)
    if(specific_locate <= 0)
    {
        result = false;
        printf("Illegal location!\n");
    }
    else
    if(specific_locate == 1)//只插入到第一个节点(头插法)
    {
        newNode = (DoubleLinkList_Cyclic*)malloc(sizeof(DoubleLinkList_Cyclic));
        newNode->data = insert_value;

        newNode->next = nowNode->next;
        nowNode->next->prior = newNode;

        nowNode->next = newNode;
        newNode->prior = nowNode;

        result = true;
    }
    else
    {
        nowNode = L->next;
        counter = 1;        //因为nowNode最低指向 L->next,所以只能插如第2~n个位置
        while(counter < (specific_locate-1) && nowNode != L)//①找到第(specific_locate-1)个元素
        {
            counter++;
            nowNode = nowNode->next;
        }
        if(nowNode == L)
        {
            result = false;
            printf("Position overrun!\n");
        }
        else
        {
            newNode = (DoubleLinkList_Cyclic*)malloc(sizeof(DoubleLinkList_Cyclic));
            newNode->data = insert_value;

            newNode->next = nowNode->next;
            nowNode->next->prior = newNode;   //新节点和后续节点

            nowNode->next = newNode;
            newNode->prior = nowNode;   //新节点和前驱节点
            result = true;
        }
    }
    return result;

}

/**************************************************
(11)函数名: Delete_SpecificLocate_CyclicList
功  能: 删除特定位置的节点值
参  数: (1)DoubleLinkList_Cyclic *&L: 要删除节点的循环双链表
        (2)int specific_locate: 要删除的特定位置
        (3)ElemType &delete_value: 删除节点的值
注  意:   ① 删除节点,至少需要一个节点
          ②后面删除的是 2~n个节点
          ③由于找到删除节点的前一个节点(specific_locate-1),前一个在范围内,
            但删除节点不一定,所以也要判断删除节点是否存在
思  路: (1)范围控制(注意事项)
        (2)找到要删除的节点的前一个位置,
        (3)删除节点
返回值:   无
**************************************************/
bool Delete_SpecificLocate_Double_CyclicList(DoubleLinkList_Cyclic *&L, int specific_locate, ElemType &delete_value)
{
    int counter;
    bool result;
    DoubleLinkList_Cyclic *nowNode,*deleteNode;
    nowNode = L;
    if(L->next == L)
    {
        result = false;
        printf("Empty cyclic double linked list !\n");
    }
    else
    if(specific_locate <= 0)
    {
        result = false;
        printf("Illegal location!\n");
    }
    else
    if(specific_locate == 1)//①至少有一个节点
    {
        deleteNode = L->next;//存储要删除的节点
        delete_value = deleteNode->data;

        L->next = deleteNode->next;
        deleteNode->next->prior = L;
        delete_value = deleteNode->data;//杀鸡取卵
        free(deleteNode);
        result = true;
    }
    else
    {
         //②后面就是删除第 2~n个节点
         nowNode = L->next;//此时我们只能删除nowNode后面的节点,也就是第二个节点
         counter = 1;
         while(counter < (specific_locate-1) && nowNode != L) //还是要找到第 specific_locate-1 个节点
         {
            counter++;
            nowNode = nowNode->next;
         }
         if(nowNode == L)
         {
            result = false;
            printf("(1)delete Position out of range !\n");
         }
         else
         {
            deleteNode = nowNode->next;
            if(deleteNode == L)
            {
                result = false;
                printf("(2)delete Position out of range !\n");
            }
            else
            {
                delete_value = deleteNode->data;

                nowNode->next = deleteNode->next;
                nowNode->next->prior = nowNode;
                free(deleteNode);
                result = true;
            }
         }
    }
    return result;
}





4. main.cpp测试函数

main.cpp

#include <stdio.h>
#include "Cyclic_DoubleLinkList.h"

int main()
{
    ElemType elem;
    DoubleLinkList_Cyclic *L1,*L2;
    ElemType A[] = {1,2,3,4,5,6,7,8};
    Create_Double_CyclicList_Head(L1,A,8);
    Display_Double_CyclicList(L1);
    printf("L1长度是%d\n",Length_Double_CyclicList(L1));
    Create_Double_CyclicList_Tail(L2,A,8);
    Display_Double_CyclicList(L2);
    printf("L2长度是%d\n",Length_Double_CyclicList(L2));
    elem = 8;
    printf("%d在L1中是第%d个元素\n",elem,SpecificValue_Location_Double_CyclicList(L1,elem));

//    Init_Double_CyclicList(L2);
    if(SpecificLocate_Value_Double_CyclicList(L2,5,elem))
    {
        printf("L2中第5个元素是%d\n",elem);
    }
    elem = 99;
    if(InsertElement_Double_CyclicList(L1,5,elem))
    {
        printf("成功在L1中第5个位置,插入%d\n",elem);
        Display_Double_CyclicList(L1);
    }
    if(Delete_SpecificLocate_Double_CyclicList(L1,5,elem))
    {
        printf("成功删除在L1中第5个位置的%d\n",elem);
        Display_Double_CyclicList(L1);
    }

    return 0;
}


5. 运行展示:

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Redis常见的一些问题和注意事项

本文汇总的都是在我们公司出现过的常见问题以及自己曾经记录的注意事项。 我们公司sentinel模式以及RedisCluster集群两种部署方式都有使用&#xff0c;下面问题有些可能是哨兵模式下存在的&#xff0c;比如批量操作&#xff0c;下面可能不会特别说明。 1、注意热点key 之前单位…

YOLOV8 + 双目测距

YOLOV8 双目测距 1. 环境配置2. 测距流程和原理2.1 测距流程2.2 测距原理 3. 代码部分解析3.1 相机参数stereoconfig.py3.2 测距部分3.3 主代码yolov8-stereo.py 4. 实验结果4.1 测距4.2 测距跟踪4.3 测距跟踪分割4.4 视频展示 相关文章 1. YOLOv5双目测距&#xff08;python&…

MySQL高级篇(存储引擎InnoDB、MyISAM、Memory)

目录 1、存储引擎简介 1.1、查询建表语句&#xff0c;默认存储引擎&#xff1a;InnoDB 1.2、查看当前数据库支持的存储引擎 1.3、创建表&#xff0c;并指定存储引擎 2、 存储引擎-InnoDB介绍 2.1、存储引擎特点 3、MyISAM存储引擎 4、Memory存储引擎 5、InnoDB、MyISAM、Memory…

layui在上传多图时,allDone方法只是在第一次全部成功时调用了

问题点&#xff1a;在使用layui框架做多张图片上传时&#xff0c;遇见只有第一次操作上传图片时&#xff0c;触发了allDone全部上传成功的方法&#xff0c;后面再添加图片时&#xff0c;就不会调用这个方法 原因&#xff1a;是因为我删除了 choose 方法&#xff0c;并且也没有将…

算法部署 | 使用TensorRT+DeepSort+YOLOv5在NVIDIA-Jetson平台上部署目标跟踪算法

项目应用场景 面向英伟达 Jetson 边缘计算平台部署目标跟踪算法场景&#xff0c;使用深度学习算法 YOLOv5 DeepSort 来实现&#xff0c;并使用 TensorRT 进行算法加速&#xff0c;项目支持 NVIDIA Jetson Xavier、NVIDIA Jetson Xavier NX、X86 平台的算法部署。 项目效果 项…

uniapp - 微信小程序 - 使用uCharts的一些问题

文章目录 uniapp - 微信小程序 - 使用uCharts的一些问题一、开发者工具显示正常&#xff0c;真机调试统计图不随页面滚动二、数据过多开启滚动条&#xff0c;无法滑动滚动条三、饼图点击不显示提示窗/点击位置bug、多个同类型统计图点击不显示提示框问题四、 formatter 自定义 …

C++进阶(五) 哈希

1. unordered系列关联式容器 1.1 unordered_map 1.2 unordered_map的接口说明 2. 底层结构 2.1 哈希概念 2.2 哈希冲突 2.3 哈希函数 2.4 哈希冲突解决 2.4.1 闭散列 2.4.2 开散列 3. 模拟实现 3.1 unordered_set 3.2 unordered_map 4.哈希的应用 4.1 位图 4.1.…

【机器学习·浙江大学】机器学习概述、支持向量机SVM(线性模型)

机器学习概述 机器学习 特征提取(feature) 根据提取的特征构造算法&#xff0c;实现特定的任务⭐&#xff08;这门课程的重点&#xff1a;假设所有的特征已经存在且有效&#xff0c;如何根据这些特征来构造学习算法&#xff09; 如下图所示&#xff0c;机器学习主要就是来进行…

ArcGIS Server 安装教程

​​​​​​​ 一、环境与文件准备 1.软件环境 已安装arcgis Desktop 10.2 2.安装及授权文件 二、安装步骤 1.下载安装包和授权文件&#xff0c;解压后打开ArcGIS Server10.2文件夹&#xff0c;打开ESRI.exe。 2.点击ArcGIS for Server后的Setup&#xff0c;开始安装。 3.…

设计模式深度解析:AI大模型下的策略模式与模板方法模式对比解析

​&#x1f308; 个人主页&#xff1a;danci_ &#x1f525; 系列专栏&#xff1a;《设计模式》《MYSQL应用》 &#x1f4aa;&#x1f3fb; 制定明确可量化的目标&#xff0c;坚持默默的做事。 策略模式与模板方法模式对比解析 文章目录 &#x1f31f;引言&#x1f31f;Part 1:…

Excel 文件底部sheet 如何恢复

偶然打开一个excel文件&#xff0c;惊奇地发现&#xff1a;原来excel文件底部的若干个sheet居然全都看不到了。好神奇啊。 用其它的电脑打开同样的excel文件&#xff0c;发现&#xff1a;其实能看到的。说明这个excel文件并没有被损坏。只要将修改相关设置。就可以再次看…

如何插入LinK3D、CSF、BALM来直接插入各个SLAM框架中

0. 简介 LinK3D、CSF、BALM这几个都是非常方便去插入到激光SLAM框架的。这里我们会分别从多个角度来介绍如何将每个框架插入到SLAM框架中 1. LinK3D:三维LiDAR点云的线性关键点表示 LinK3D的核心思想和基于我们的LinK3D的两个LiDAR扫描的匹配结果。绿色线是有效匹配。当前关…

WPS二次开发系列:WPS SDK实现文档打印功能

在办公场景或者家教场景中经常碰到需要对文档进行打印的能力&#xff0c;今天给大家带来一篇如何通过WPS SDK调用WPS打印接口实现文档打印能力 最终实现效果图 实现步骤 2.1. 申请集成资料 通过向WPS官方发送邮件申请&#xff0c;审批通过后即可获取集成相关资料&#xff0c;详…

AI智能分析盒子在工地的应用,提高工地管理效率和安全性

工地ai智能分析盒子是一种基于人工智能视觉分析技术的人工智能盒子&#xff0c;旨在提升工地作业区域的管理效率和保障作业人员的安全。通过最前沿的AI视觉算法、大数据&#xff0c;能够实时监控工地现场视频流画面&#xff0c;对施工工地人员的工作着装及日常作业行为进行规范…

Shell脚本从0到会基础学习(个人学习)

一、前言 本人在找工作的时候&#xff0c;发现有的职位要会shell或者是python其中一种脚本语言。由于博主学过python。所以专门开栏学习&#xff0c;只做个人学习。一天学会那种~ 二、练习 2.1 我的第一个脚本--HelloWorld 代码 运行结果 2.2 输出系统常量和 自定义变量 #!…

wheeltec轮趣ROS教育机器人的网络连接

一、术语解析 宿主机&#xff1a;宿主机是指物理主机&#xff0c;比如用于开发测试的笔记本电脑和台式机电脑。 虚拟机&#xff1a;虚拟机是指安装在宿主机的VMware&#xff0c;推荐在宿主机上安装虚拟机&#xff0c;官方提供虚拟机的镜像以及配套的开发环境。 ROS主机&…

《云原生安全攻防》-- 云原生应用风险分析

为了满足每位朋友的学习需求&#xff0c;并且支持课程的持续更新&#xff0c;本系列课程提供了免费版和付费视频版两种方式来提供课程内容。我们会持续更新课程内容&#xff0c;以确保内容的度和实用性。 在本节课程中&#xff0c;我们将一起探讨云原生应用在新的架构模式下可能…

plasmo浏览器插件框架使用react和ant.design框架创建页面内容脚本UI样式注入

使用plasmo开发浏览器插件的时候&#xff0c;想要使用内容脚本UI注入自定义的UI组件&#xff0c;官方文档&#xff1a;Content Scripts UI – Plasmo&#xff0c;最好是搭配上好看的UI样式&#xff0c;所以可以集成ant.design的UI组件库&#xff0c;但是只集成组件还不行&#…

前端入门(认识HTML,CSS,JavaScript三件套)

目录 前言 HTML&#xff08;构建&#xff09; CSS&#xff08;设计&#xff09; JavaScript&#xff08;互动&#xff09; 总结 相关书籍推荐 前言 前端&#xff08;Frontend&#xff09;指的是与用户直接交互的部分&#xff0c;也称为客户端。在网站或者应用程序中&…

PyCharm关闭项目后等待时间长

每次关闭项目或PyCharm时&#xff0c;会显示正在关闭项目&#xff0c;而这个关闭时间很长且不可确定&#xff0c;很浪费我们的时间&#xff0c;不过愿意等的话&#xff0c;倒也是可以。 解决方法 Help -> Find Action -> 查找 Registry -> 禁用 ide.await.scope.comp…