实验五:实现循环双链表各种基本运算的算法
实验五:实现循环双链表各种基本运算的算法
一、实验目的与要求
目的:领会循环双链表存储结构和掌握循环双链表中各种基本运算算法设计。
内容:编写一个程序cdinklist.cpp,实现循环双链表的各种基本运算和整体建表算法(假设循环双链表的元素类型ElemType为char),并在此基础上设计一个主程序,完成如下功能:
(1)初始化循环双链表h。
(2)依次采用尾插法插入a、b、c、d、e元素
(3)输出循环双链表h。
(4)输出循环双链表h长度
(5)判断循环双链表h是否为空。
(6)输出循环双链表h的第3个元素
(7)输出元素a的位置。
(8)在第4个元素位置上插人f元素
(9)输出循环双链表h。
(10)删除循环双链表h的第3个元素
(11)输出循环双链表h。
(12)释放循环双链表h。
二、实验类型
C++算法编程
三、实验原理及说明
循环链表(circular linked list)是另一种形式的链式存储结构。循环链表有循环单链表和循环双链表两种类型,循环单链表的结点类型和非循环单链表的结点类型LinkNode 相同,循环双链表的结点类型和非循环双链表的结点类型 DinkNode 相同。
把双链表改为循环双链表的过程是将它的尾结点的next指针域由原来为空改为指问头结点,将它的头结点的 prior 指针域改为指向尾结点,整个双链表形成两个环。
循环链表的基本运算的实现算法与对应非循环链表的算法基本相同,主要差别是对于循环单链表或循环双链表L,判断表尾结点p的条件是p->next=-L;另外在循环双链表L 中可以通过L->prior 快速找到尾结点
四、实验主要仪器设备和材料
序 号 | 名 称 | 主要用途 |
1 | 电脑 | 打开软件 |
2 | Dev c++ | 编写代码,运行代码 |
五、实验内容和步骤
根据《教程》中2.3.4节的算法得到cdlinklist.cpp程序,其中包含如下函数。
InitList(DLinkNode *&L):初始化循环双链表L。
DestroyList(DLinkNode xL):释放循环双链表L。
ListEmpty(DLinkNode *L):判断循环双链表L是否为空表。
ListLength(DLinkNodexL):返回循环双链表L的元素个数
DispList(DLinkNode *L):输出循环双链表L。
GetElem(DLinkNode *L,inti,ElemType &e):获取循环双链表L中第i个元素。LocateElem(DLinkNode *L,ElemType e):在循环双链表L中查找元素e。ListInsert(DLinkNode *&L,inti,ElemTypee):在循环双链表L中第i个位置上插入元素e。
ListDelete(DLinkNode *&L,inti,ElemType&e):从循环双链表L中删除第i个元素。对应的程序代码如下(设计思路详见代码中的注释):
步骤:
创建一个cdlinklist.cpp文件,将函数写入文件中
创建一个main.cpp文件,编写主函数,对函数进行验证
实验内容:
-
- 编写cdlinklist
#include <iostream>#include <malloc.h>using namespace std;typedef char ElemType;typedef struct DNode {ElemType data;struct DNode *prior;struct DNode *next;} DLinkNode;//头插法建立循环双链表void CreateListF(DLinkNode *&L, ElemType a[], int n) {DLinkNode *s;L = new DLinkNode;L->next = NULL;for (int i = 0; i < n; i++) {s = new DLinkNode;s->data = a[i];s->next = L->next;if (L->next != NULL) L->next->prior = s;L->next = s;s->prior = L;}s = L->next;while(s->next != NULL)s = s->next;s->next = L;}//尾插法创建循环双链表void CreateListR(DLinkNode * &L, ElemType a[], int n) {DLinkNode *s, *r;L = new DLinkNode;L->next = NULL;r = L;for (int i = 0; i < n; i++) {s = new DLinkNode;s->data = a[i];r->next = s;s->prior = r;r = s;}r->next = L;L->prior = r;}void InitList(DLinkNode *&L) { //初始化循环双链表L = new DLinkNode;L->prior = L->next = L;}void DestroyList(DLinkNode *&L) { //摧毁循环双链表DLinkNode *pre = L, *p = pre->next;while(p != L) {delete pre;pre = p;p = pre->next;}delete pre;}bool ListEmpty(DLinkNode *L) { //判断是否为空return (L->next == L);}int ListLength(DLinkNode *L) { //判断长度DLinkNode *p = L;int i = 0;while(p->next != L) {i++;p = p->next;}return i;}void DispList(DLinkNode *L) { //输出线性表DLinkNode *p = L->next;while(p != L) {cout << p->data << " ";p = p->next;}cout << endl;}//获取循环双链表L中的第i个元素bool GetElem(DLinkNode *L, int i, ElemType &e) {int j = 1;DLinkNode *p = L->next;if (i <= 0|| L->next == L) return 0;if (i == 1) {e = L->next->data;return 1;}else {while(j < i && p!= L) {j++;p = p->next;}if (p == L)return 0;else {e = p->data;return 1;}} }//在循环双链表L中查找元素eint LocateElem(DLinkNode *L, ElemType e) {int i = 1;DLinkNode *p = L->next;while(p != L && p->data != e) {p = p->next;i++;}if (p == L)return 0;elsereturn i;}bool ListInsert(DLinkNode *&L, int i, ElemType e) {int j = 1;DLinkNode *p = L, *s;if(i <= 0) return 0;if (p->next == L) {s = new DLinkNode;s->data = e;p->next = s; s->next = p;p->prior = s; s->prior = p;return 1;}else if (i == 1) {s = new DLinkNode;s->data = e;s->next = p->next; p->next = s;s->next->prior = s; s->prior = p;return 1;}else {p = L->next;while(j < i - 1 && p != L) {j++;p = p->next;}if (p == L)return 0;else {s = new DLinkNode;s->data = e;s->next = p->next;if (p->next != NULL) p->next->prior = s;s->prior = p;p->next = s;return 1;}}}bool ListDelete(DLinkNode *&L, int i, ElemType &e) {int j = 1;DLinkNode *p = L, *q;if (i <= 0 || L->next == L) return 0;if (i == 1) {q = p->next;e = q->data;L->next = q->next;q->next->prior = L;delete q;return 1;}else {p = L->next;while(j < i - 1 && p != L) {j++;p = p->next;}if(p == L)return 0;else {q = p->next;e = q->data;p->next = q->next;if (p->next != L) p->next->prior = p;delete q;return 1;}}}
编写main函数
#include "cdlinklist.cpp"int main() {DLinkNode *h;ElemType e;cout <<"双链表的基本运算如下:" << endl;cout << "(1)初始化循环双链表h" << endl; InitList(h);cout <<"(2)依次采用尾插法插人a,b,c,d,e元素" << endl;ListInsert(h,1,'a');ListInsert(h,2,'b');ListInsert(h,3,'c');ListInsert(h,4,'b');ListInsert(h,5,'a');cout <<"(3)输出循环双链表h:"; DispList(h);cout << "(4)循环双链表h长度:"<< ListLength(h) << endl;cout << "(5)循环双链表h为"<< (ListEmpty(h)?"空":"非空") << endl;GetElem(h, 3, e); cout << "(6)循环双链表h的第3个元素:" << e << endl;cout <<"(7)元素a的位置:" << LocateElem(h,'a') << endl;cout <<"(8)在第4个元素位置上插人f元素" << endl; ListInsert(h,4,'f');cout <<"(9)输出循环双链表h:"; DispList(h);cout <<"(10)删除h的第3个元素" << endl; ListDelete(h,3,e);cout <<"(11)输出循环双链表h:"; DispList(h);cout <<"(12)释放循环双链表h"<< endl;DestroyList(h);return 1;}
运行结果:
六、实验小结与分析
在此次实验中我领会了循环双链表链表存储结构,掌握了循环双链表链表中的各种基本运算算法设计,循环链表是另一种形式的链式存储结构,但是它可以在链表的基础上修改而来,把双链表改为循环双链表的过程是将它的尾结点的next指针域由原来为空改为指问头结点,将它的头结点的 prior 指针域改为指向尾结点,整个双链表形成两个环。这种可以不用双链表的形式就可以实现快速找到尾结点等功能。在判断是否为对称的链表问题中很好的表现出了循环双链表相对于双链表的优势,可以向后遍历,也可以向前遍历,比双链表更加容易比较是否对称。此次实验使我了解到了循环链表的好处,与循环链表的区别所在,使我对算法有了更加的了解。
相关文章:

实验五:实现循环双链表各种基本运算的算法
实验五:实现循环双链表各种基本运算的算法 一、实验目的与要求 目的:领会循环双链表存储结构和掌握循环双链表中各种基本运算算法设计。 内容:编写一个程序cdinklist.cpp,实现循环双链表的各种基本运算和整体建表算法(假设循环双链表的元素类型ElemType为char),并…...

ElasticSearch IK分词器的安装、词典扩展与停用
🏷️个人主页:牵着猫散步的鼠鼠 🏷️系列专栏:云原生与服务部署-专栏 🏷️个人学习笔记,若有缺误,欢迎评论区指正 目录 编辑 1. 前言 2. IK分词器安装 3. IK分词器词典扩展与停用 4. 总…...
代码随想录训练营总结
为期两个月的代码随想录训练营今天结束了,我想我的收获是非常大的。进到训练营的大群里,令我有种安心的感觉,原来世界各地有这么多与我一起努力的伙伴。更令人安心的是知识星球对于学习进度的规划,细化到每一天每道题,…...

深度学习-转置卷积
转置卷积 转置卷积(Transposed Convolution),也被称为反卷积(Deconvolution),是深度学习中的一种操作,特别是在卷积神经网络(CNN)中。它可以将一个低维度的特征图&#x…...

Unity性能优化工具介绍
文章目录 一.Stats组件1.Audio音频的数据组件:2.图形数据 二.Profiler 性能分析器 一.Stats组件 Unity自带Statistics(统计数据),Game视窗中点击Stats打开 1.Audio音频的数据组件: 1):Level 声音强度 单位是分贝(dB) 表示音频听声音的大小,是闪烁波动的. 2):SDPload 数据信…...
Math之向上向下取整
有时我们会遇到向上和向下取整的操作,这时我们可以使用Math类来进行操作。 1、向上取整 Math.ceil() 方法返回大于或等于指定表达式的最小整数(即向上取整)。如果参数是一个整数,那么结果就是这个整数本身。 示例: …...
MPP架构
MPP架构,即Massively Parallel Processing(大规模并行处理)架构,是一种用于处理大规模数据的并行计算架构。它通过将数据和计算能力分布在多个处理节点上,利用并行处理技术来加速数据处理和分析的速度。 在MPP架构中&…...
These relative modules were not found:* ../../../constant in
这个错误信息表明,你的项目在尝试加载一个相对路径模块 ../../../constant 时遇到了问题。具体来说,它在 ./node_modules/cache-loader/dist/cj 这个路径下找不到这个模块。 这里有几个可能的原因和相应的解决方案: 路径错误:首…...

2024最新彩虹聚合DNS管理系统源码v1.3 全开源
2024最新彩虹聚合DNS管理系统源码v1.3 全开源 聚合DNS管理系统可以实现在一个网站内管理多个平台的域名解析,目前已支持的域名平台有:阿里云、腾讯云、华为云、西部数码、DNSLA、CloudFlare。 本系统支持多用户,每个用户可分配不同的域名解…...
在Go语言中如何实现变参函数和函数选项模式
在Go语言编程中,我们经常会遇到需要给函数传递可选参数的情况。传统的做法是定义一个结构体,将所有可选参数作为结构体字段,然后在调用函数时创建该结构体的实例并传递。这种方式虽然可行,但是当可选参数较多时,创建结构体实例的代码就会变得冗长และ不太直观。 Go语言的一个…...
Spring Boot中的 6 种API请求参数读取方式
使用Spring Boot开发API的时候,读取请求参数是服务端编码中最基本的一项操作,Spring Boot中也提供了多种机制来满足不同的API设计要求。 接下来,就通过本文,为大家总结6种常用的请求参数读取方式。如果你发现自己知道的不到6种&a…...

Linux基础命令[27]-gpasswd
文章目录 1. gpasswd 命令说明2. gpasswd 命令语法3. gpasswd 命令示例3.1 不加参数3.2 -a(将用户加入组)3.3 -d(从组中删除用户)3.4 -r(删除组密码)3.5 -M(多个用户一起加入组)3.6 …...

机会约束转化为确定性约束-- 样本均值法
当涉及到新能源消纳的机会约束规划时,我们需要深入理解其背后的原理和采用的方法。以下是对上文内容的更详细且更贴切的展开解释: 机会约束转化为确定性约束-- 样本均值法代码获取戳此处代码获取戳此处代码获取戳此处 新能源消纳的机会约束 新能源&…...
uniapp中,当页面显示时触发子组件的重新渲染
使用watch监听数据变化: 在子组件中使用watch来监听父组件传递的数据,一旦数据发生变化,子组件就会重新渲染。 子组件代码示例: <template><div>{{ message }}</div> </template><script> export d…...
先进制造aps专题五 aps软件的排程算法和优化算法介绍
aps软件的核心,主要是数据管理,排程/优化算法,各类甘特图 所有aps软件排程算法都是Heuristics启发式算法(如Greedy算法),只是有的aps软件还支持ga遗传算法优化(比如sap apo,oracle aps,isuperap…...

【跳坑日记】暴力解决Ubuntu SSH报错: Failed to start OpenBSD Secure Shell server
报错环境说明: 服务器环境:Ubuntu 20.04 错误内容 最近服务器突然报错,提示如下图信息: 搜素了各种问答,国内的回答大多数是用 ssh-keygen -A命令来解决,但最终也无法登录服务器。 最终搜索到ask ubun…...

从需求角度介绍PasteSpider(K8S平替部署工具适合于任何开发语言)
你是否被K8S的强大而吸引,我相信一部分人是被那复杂的配置和各种专业知识而劝退,应该还有一部分人是因为K8S太吃资源而放手! 这里介绍一款平替工具PasteSpider,PasteSpider是一款使用c#编写的linux容器部署工具(使用PasteSpider和…...
线性三角化
点的线性三角化 输入一堆的点 [ R w c , t w c , p u c ] [R_{wc},t_{wc},p_{uc}] [Rwc,twc,puc]转化成空间的一系列射线 [ P w i , t w i ] , P w i t w c , t w i R w c p u c [P_{wi},t_{wi}],P_{wi}t_{wc},t_{wi}R_{wc}\times p_{uc} [Pwi,twi],Pwitwc…...

Golang os.Rename invalid cross-device link的原因
文章目录 背景运行环境 文件系统对比linux下的文件系统mac下的文件系统linux下的mv指令 golang的os.Rename源码os.Renamesyscall.Renamesyscall.RenameatSYS_RENAMEAT是什么 查看系统调用函数文档什么是man pageman page的用法user commandssystem calls renameat不支持跨挂载点…...
Flutter 中的 Badge 小部件:全面指南
Flutter 中的 Badge 小部件:全面指南 在移动应用设计中,徽章(Badge)是一种常见的UI元素,用于吸引用户注意并展示重要信息,如未读消息数量、新通知等。Flutter 通过各种第三方包提供了徽章小部件࿰…...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)
概述 在 Swift 开发语言中,各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过,在涉及到多个子类派生于基类进行多态模拟的场景下,…...
【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密
在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...

vscode(仍待补充)
写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh? debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...

苍穹外卖--缓存菜品
1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得,如果用户端访问量比较大,数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据,减少数据库查询操作。 缓存逻辑分析: ①每个分类下的菜品保持一份缓存数据…...

【7色560页】职场可视化逻辑图高级数据分析PPT模版
7种色调职场工作汇报PPT,橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版:职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...

【VLNs篇】07:NavRL—在动态环境中学习安全飞行
项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战,克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...

基于Springboot+Vue的办公管理系统
角色: 管理员、员工 技术: 后端: SpringBoot, Vue2, MySQL, Mybatis-Plus 前端: Vue2, Element-UI, Axios, Echarts, Vue-Router 核心功能: 该办公管理系统是一个综合性的企业内部管理平台,旨在提升企业运营效率和员工管理水…...
省略号和可变参数模板
本文主要介绍如何展开可变参数的参数包 1.C语言的va_list展开可变参数 #include <iostream> #include <cstdarg>void printNumbers(int count, ...) {// 声明va_list类型的变量va_list args;// 使用va_start将可变参数写入变量argsva_start(args, count);for (in…...

R 语言科研绘图第 55 期 --- 网络图-聚类
在发表科研论文的过程中,科研绘图是必不可少的,一张好看的图形会是文章很大的加分项。 为了便于使用,本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中,获取方式: R 语言科研绘图模板 --- sciRplothttps://mp.…...

消防一体化安全管控平台:构建消防“一张图”和APP统一管理
在城市的某个角落,一场突如其来的火灾打破了平静。熊熊烈火迅速蔓延,滚滚浓烟弥漫开来,周围群众的生命财产安全受到严重威胁。就在这千钧一发之际,消防救援队伍迅速行动,而豪越科技消防一体化安全管控平台构建的消防“…...