实验五:实现循环双链表各种基本运算的算法

实验五:实现循环双链表各种基本运算的算法

一、实验目的与要求

目的:领会循环双链表存储结构和掌握循环双链表中各种基本运算算法设计。

内容:编写一个程序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文件,编写主函数,对函数进行验证

实验内容:

    1. 编写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 指针域改为指向尾结点,整个双链表形成两个环。这种可以不用双链表的形式就可以实现快速找到尾结点等功能。在判断是否为对称的链表问题中很好的表现出了循环双链表相对于双链表的优势,可以向后遍历,也可以向前遍历,比双链表更加容易比较是否对称。此次实验使我了解到了循环链表的好处,与循环链表的区别所在,使我对算法有了更加的了解。

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

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

相关文章

【加密与解密(第四版)】第十七章笔记

第十七章 软件保护技术 17.1 防范算法求逆 17.2 抵御静态分析 反汇编算法&#xff1a;线性扫描&#xff08;无法正确地将代码和数据分开&#xff09;、递归进行 巧妙构造代码和数据&#xff0c;在指令流中插入很多“数据垃圾"&#xff0c;干扰反汇编软件的判断&#xf…

百度手机号登录iApp源码V3

本源码直接对接百度网页版登录接口&#xff0c;无需跳转第三方APP或者网页&#xff0c;可直接进行输入手机号获取验证码的步骤&#xff0c;登录后可获取到用户的UID&#xff0c;名称&#xff0c;BDUSS&#xff0c;PTOKEN&#xff0c;STOKEN&#xff0c;头像直链。 源码下载&…

若依nodejs版本过高问题解决方案

由于nodejs版本过高,可能会导致vue-cli项目运行报错。 目录 方法1:每次启动项目前,输入配置命令 方法2:修改package.js

docker 网络模式

四种模式介绍 宿主机可上网,容器内便可上网.且能ping通宿主机同网段服务 Docker网络模式 配置 说明 host模式 --nethost 容器和宿主机共享Network namespace。 container模式 --netcontainer:NAME_or_ID 容器和另外一个容器共享Network namespace。 kubernetes中的pod…

【DevOps】深入浅出:Jenkins 性能监控全解析

目录 一、监控指标&#xff1a;把握系统健康状况 1、资源利用率&#xff1a; 2、 任务执行效率&#xff1a; 3、系统稳定性&#xff1a; 二、监控工具&#xff1a;选择合适的利器 1、Jenkins 内置监控 1.1、Jenkins Performance Plugin&#xff1a;系统性能指标的直观展…

性能测试工具

性能测试工具 1.Jmeter 环境搭建1.安装JDK2.安装Jmeter1.下载2.安装3.环境配置 3.Jmeter 文件目录介绍1.bin目录2.docs 目录3.printable_docs目录4.lib目录 4.修改默认配置1.汉化配置2.修改主题 5.元件的基本介绍6.元件的作用域作用域的原则 7.元件的执行顺序 1.Jmeter 环境搭建…

登录安全分析报告:创蓝云智注册

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞…

ubuntu22.04下 easyconnect+输入法安装

先使用对应ubuntu版本的easyconnect安装 sudo dpkg -i EasyConnect_x64_7_6_7_3.deb 下载压缩包servicePack&#xff0c;并解压缩 cd 下载路径/servicePack sudo cp * /usr/share/sangfor/EasyConnect/ 打开easyConnect /usr/share/sangfor/EasyConnect/EasyConnect 此处…

Windows安全应急--反隐身术

NO.1 dir命令 首先做个演示&#xff0c;把演示01这个文件夹隐藏起来&#xff0c; 在文件夹上是看不到了&#xff0c; 我们可以使用dir命令查看&#xff0c; NO.2 文件夹选项–显示隐藏 这个是非常常规的了&#xff0c; 这里不做过多介绍 有些隐藏文件很顽固&#xff0c;上面…

mysql基础概念

一 基本操作 1 SQL分类 数据库&#xff1a;database 表&#xff1a;table&#xff0c;行&#xff1a;row 列&#xff1a;column 索引&#xff1a;index 视图&#xff1a;view 存储过程&#xff1a;procedure 存储函数&#xff1a;function 触发器&#xff1a;trigger 事…

使用HiBurn烧录鸿蒙.bin文件到Hi3861开发板

鸿蒙官方文档的“Hi3861开发板第一个示例程序”中描述了——如何使用DevEco Device Tool工具烧录二进制文件到Hi3861开发板&#xff1b; 本文将介绍如何使用HiBurn工具烧录鸿蒙的.bin文件到Hi3861开发板。 获取HiBurn工具 通过鸿蒙官方文档我们知道DevEco Device Tool是一个V…

Docker访问文件权限受限问题解决

问题描述 运行项目的docker环境&#xff0c;新添加了一个数据集&#xff0c;但是数据集的访问权限受限&#xff08;Permission dinied&#xff09;&#xff0c;运行的命令如图所示 问题解决 chmod 777 xxx YYDS&#xff01;&#xff01;&#xff01;但是单纯直接运行会因为权限…

5.22R语言初步学习-1

今天上课讲R语言&#xff0c;要干什么没讲&#xff0c;分析什么&#xff0c;目的是什么没讲。助教基本上就是让我们打开窗口&#xff0c;按要求抄代码指令&#xff0c;代码原理也没讲......再加上最近正好在学概率论与数理统计&#xff0c;肯定是有用的&#xff0c;所以还是学习…

CLIP论文学习

学习来自B站bryanyzhu

【list】list库介绍 + 简化模拟实现

本节博客先对list进行用法介绍&#xff0c;再在库的基础上简化其内容和形式&#xff0c;简单进行模拟实现&#xff0c;有需要借鉴即可。 目录 1.list介绍1.1 list概述1.2相关接口的介绍 2.简化模拟实现3.各部分的细节详述3.1结点3.2迭代器细节1&#xff1a;迭代器用原生指针还是…

风控指南:国内车险欺诈呈现四大趋势

目录 车险欺诈呈现内外勾结的团伙化 防范车险欺诈需要多重合作 保险企业需要提升反欺诈能力 监管部门需要加强协同合作 2024年4月11日&#xff0c;国家金融监督管理总局官网发布国家金融监督管理总局关于《反保险欺诈工作办法&#xff08;征求意见稿&#xff09;》公开征求意见…

Spark-广播变量详解

Spark概述 Spark-RDD概述 1.为什么会需要广播变量&#xff1f; 广播变量是为了在分布式计算环境中有效地向集群中的所有节点广播大型只读数据集而设计的。 在分布式环境中&#xff0c;通常会遇到需要在所有节点上使用相同的数据集的情况&#xff0c;但是将这些数据集复制到每个…

ChatGPT移动应用收入在GPT-4o发布后迎来最大涨幅

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

Redis崩溃后,如何进行数据恢复的?no.24

本课时我们主要学习通过 RDB、AOF、混合存储等数据持久化方案来解决如何进行数据恢复的问题。 Redis 持久化是一个将内存数据转储到磁盘的过程。Redis 目前支持 RDB、AOF&#xff0c;以及混合存储三种模式。 RDB Redis 的 RDB 持久化是以快照的方式将内存数据存储到磁盘。在…

SpringCloud系列(27)--OpenFeign日志增强

前言&#xff1a;在上一章节中我们简单的介绍了如何去调节OprnFeign的连接超时时间&#xff0c;在OpenFeign的使用过程中可能需要对Feign接口的调用情况进行监控和输出&#xff0c;这时候就需要对OpenFeign进行日志增强处理&#xff0c;所以本节的内容即是关于OpenFeign的日志增…