循环双链表算法库构建

学习贺老师数据结构数据结构之自建算法库——循环双链表_数据结构编写一个程序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");}elseif(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");}elseif(specific_locate <= 0){result = false;printf("Illegal location!\n");}elseif(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. 运行展示:

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

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

相关文章

相机标定——四个坐标系介绍

世界坐标系(Xw,Yw,Zw) 世界坐标系是一个用于描述和定位三维空间中物体位置的坐标系&#xff0c;通常反映真实世界下物体的位置和方向。它是一个惯性坐标系&#xff0c;被用作整个场景或系统的参考框架。在很多情况下&#xff0c;世界坐标系被认为是固定不变的&#xff0c;即它…

51单片机之串口通信

目录 1.串口简介 1.1TXD和RXD 1.2通讯接口 1.3通信方式 1.4 51单片机的UART模式 2.串口配置 2.1寄存器简介 SCON寄存器配置 PCON配置 2.2代码配置串口 2.2.1 配置串口发送数据 2.2.2配置电脑向单片机发送数据点亮LED 1.串口简介 串口是一个应用十分广泛的通讯接口&am…

对接穿山甲激励视频广告,收益如何?

激励视频广告一直是广告平台探索的重要广告类型&#xff0c;在激励任务达成或者激励视频退出时&#xff0c;为用户新增广告任务。“激励视频”广告满足部分用户多看广告获得更多奖励心理的需求的同时&#xff0c;提升了开发者广告曝光机会。进而提升了广告变现效率。#APP广告变…

复习知识点整理

零碎语法 1.导入某个文件夹的index文件&#xff0c;index可以省略&#xff08;这里导入的是router和store文件下的index.js文件&#xff09; 2.路由懒加载 this 1.在vue文件中使用router\store对象时 this&#xff1a;普通函数的this指向vue实例对象(在没有明确指向的时候…

上位机软件与美国罗克韦尔AB PLC无线以太网通讯测试

在实际系统中&#xff0c;同一个车间里分布多台PLC&#xff0c;通过上位机集中控制。通常所有设备距离在几十米到上百米不等。在有通讯需求的时候&#xff0c;如果布线的话&#xff0c;工程量较大耽误工期&#xff0c;这种情况下比较适合采用无线通信方式。本方案以组态王和2台…

在渲染项目instant-ngp使用代码(run.py)实现的补充说明

0 引言 最近&#xff0c;在做一个项目中有需要使用渲染接口&#xff0c;需要使用代码来实现。详细的步骤在文章instant-ngp中run.py的使用_/instant-ngp/./scripts/run.py", line 25, in https://blog.csdn.net/fengbingchun/article/details/129770444?ops_request_misc…

【C++】继承总结

一、前言 我们众所周知的C三大特性分别为&#xff1a;封装、继承、多态。 封装就是将接口实现统一化&#xff0c;隐藏那些不同的地方&#xff0c;在上层函数调用体现的方式一样&#xff0c;如各种容器的迭代器iterator&#xff0c;尽管底层实现的方式不同&#xff0c;但是在使用…

ArcGIS Server 安装教程

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

labelme安装和使用

源码地址&#xff1a; git clone https://github.com/labelmeai/labelme.git 描述 是一个图形图像注释工具,灵感来自 http://labelme.csail.mit.edu . 它是用比顿编写的,并使用QT进行图形化接口。 实例分割的VOC数据集示例。 其他例子(语义分割、B箱检测和分类)。 各种原语(多…

manga-ocr漫画日文ocr

github 下载 解压 anaconda新建环境 conda create -n manga_ocr python3.8 激活环境 conda activate manga_ocr cd到解压目录 cd /d manga-ocr-master 安装依赖包 pip install -r requirements.txt pip3 install manga-ocr 下载离线model huggingface 123云盘 解压到一个目录…

宏集PLC如何为楼宇自动化行业提供空调、供暖与通风的解决方案?

一、应用背景 楼宇自动化行业是通过将先进的技术和系统应用于建筑物中&#xff0c;以提高其运营效率、舒适度和能源利用效率的行业&#xff0c;其目标是使建筑物能够自动监控、调节和控制各种设备和系统&#xff0c;包括照明系统、空调系统、安全系统、通风系统、电力供应系统…

rsync 远程同步 基础介绍

目录 一 Rsync 简介 1&#xff0c;rsync 是什么 2&#xff0c;rsync 中的发起端 同步源 3&#xff0c;同步方式 4&#xff0c;备份的方式 5&#xff0c;常用Rsync命令 6&#xff0c; 配置源的两种表达方法 7&#xff0c;rsync做本地复制时与cp 对比 二&#xff…

【4036】基于小程序+ssm实现的软件学院会议室管理系统

作者主页&#xff1a;Java码库 主营内容&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app等设计与开发。 收藏点赞不迷路 关注作者有好处 文末获取源码 技术选型 【后端】&#xff1a;Java 【框架】&#xff1a;ssm 【…

Vue中的键盘事件

目 录 1. 概述 2. JavaScript 键盘事件 2.1 键盘事件类型 2.1.1 keydown 事件2.1.2 keypress 事件2.1.3 keyup 事件2.1.4 input 事件 2.2 键盘事件的响应顺序 3. Vue 键盘事件监听与处理 3.1 获取按键的 键码&#xff08;keyCode&#xff09;3.2 监听按键事件 4. Vue 按键…

java理论小作业(2)--类

第一题 1.题目&#xff1a; 2.解析&#xff1a; 首先&#xff0c;我们来分析Hello1类的结构和给定代码的执行流程&#xff1a; Hello1类中有两个成员变量&#xff0c;一个静态的a和一个非静态的b。静态变量a属于类本身&#xff0c;而非静态变量b属于类的每一个实例&#xff…

开启Java之旅——用Java实现简易的图书管理系统(24.4.7)

图书管理系统 一、设计思路 1、首先需要区分两类人&#xff0c;图书管理员和借书用户&#xff0c;不同的用户要展现不同的界面&#xff0c;利用继承和多态可以将其实现。 2、要将不同的操作封装起来&#xff0c;单独设计成为一个类&#xff0c;为了规范实现&#xff0c;需要…

LeetCode-33. 搜索旋转排序数组【数组 二分查找】

LeetCode-33. 搜索旋转排序数组【数组 二分查找】 题目描述&#xff1a;解题思路一&#xff1a;二分查找。1.找哨兵节点&#xff08;nums[0]或nums[-1]&#xff09;可以确定nums[mid]位于前一段或后一段有序数组中。2. 就是边界left和right的变换&#xff0c;具体看代码。解题思…

基于SpringBoot的“民宿管理平台系统”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“民宿管理平台系统”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 用户首页界面图 民宿信息管理界面图 房间预订…

IFC文件分析工具Top 5

分析行业基础类 (IFC) 文件是确保建筑信息模型 (BIM) 数据准确性和一致性的关键步骤。 在验证这些文件期间需要考虑各个方面&#xff0c;以避免错误并确保项目的最佳运行。 在本文中&#xff0c;我们将介绍验证 IFC 文件的五种有效方法&#xff0c;帮助你对 IFC 文件的质量充…

python开发poc2,爆破脚本

#本课知识点和目的&#xff1a; ---协议模块使用&#xff0c;Request 爬虫技术&#xff0c;简易多线程技术&#xff0c;编码技术&#xff0c;Bypass 后门技术 下载ftp服务器模拟器 https://lcba.lanzouy.com/iAMePxl378h 随便创建一个账户&#xff0c;然后登录进去把ip改成…