数据结构-带头结点的循环链表
- 格式:docx
- 大小:22.83 KB
- 文档页数:12
习题一1.填空题(1)数据的逻辑结构可形式地用一个二元组B=(K,R)来表示,其中K是_________,R是________。
(2)存储结构可根据数据元素在机器中的位置是否连续分为____,____。
(3)算法的基本要求有_____,_____,____,____,____。
(4)度量算法效率可通过_______,_______两方面进行。
2.简述下列术语:数据数据元素数据对象数据结构存储结构数据类型。
3. 常用的存储表示方法有哪几种?4.举例说明一下数据结构和算法的关系。
5.设有数据逻辑结构为B=(K,R),K={k1,k2,……,k9}r={<k1,k3>,<k3,k8>,<k2,k3>,<k2,k4>,<k2,k5>,<k3,k9>,<k5,k6>,<k8,k9>,<k9,k7 >, <k4,k7>,<k4,k6>}画出这个逻辑结构的图示,并确定相对于r哪些结点是开始结点,哪些结点是终端结点?6.试举一个数据结构的例子,并叙述其逻辑结构、存储结构、运算三方面的内容。
7.何谓算法?试详述算法设计的目的和算法必须满足的条件。
8.编写一个算法,对三个两位数按由大到小的顺序进行排序。
描述构造该算法的思维过程。
习题二1.如定理2.1所描述的,从盒子中往外取球,在1-4所给的答案中,哪一个是i,j,k对应的值。
①Red,5,6②Blue,5,6③Blue,3,Red④6,5,Red2.如定理2.1所描述的,从盒子往外取球,在1-4所给的答案中,哪一个是i,j,k对应的值。
①6,7,Red②Blue,7,3③8,2,Red④9,Red,13.假设T1(N)= O(F(N)),T2(N)= O(F(N)),说明下列哪一个正确?①T1 (N)+ T2 (N) = O(F(N))②T1 (N)- T2 (N) = O(F(N))③T1 (N)/ T2 (N) = O(1)④T1 (N) = O(T2 (N))4.假设两个算法的时间复杂度分别为T1(N)=O(N)和T2(N)=O(N2),说明下列哪一个正确(估算)?①T1(N)* T2(N)= O(N3)②T1(N)+ T2(N)= O(N2)③T2(N)/ T1(N)= O(N)④T2(N)- T1(N)= O(N)5.基于定理2.2的描述,为什么不能充分获得一个最大连续子序列之和的次平方运行时间?6.读者思考:由算法2.1到算法2.2的改进过程中,时间复杂度由三次降到二次,那么算法的空间复杂度有没有变化?这种改进是不是无条件的?7.将下列各式组合成与Big-Oh相等的函数。
2024年自考-自考专业(计算机网络)-数据结构考试历年真题常考点试题带答案(图片大小可任意调节)第1卷一.单选题(共20题)1.若对某线性表最常用的操作是在最后一个结点之后插入一个新结点或删除最后一个结点,要使操作时间最少,下列选项中,应选择的存储结构是()。
A.无头结点的单向链表B.带头结点的单向链表C.带头结点的双循环链表D.带头结点的单循环链表2.判断两个串大小的基本准则是()。
A.两个串长度的大小B.两个串中首字符的大小C.两个串中大写字母的多少D.对应的第一个不等字符的大小3.下列关键字序列中,构成大根堆的是()。
A.5, 8,1,3,9, 6,2,7B.9 ,8,1,7,5,6,2,33C.9, 8,6,3,5, l ,2,7D.9,8,6,7,5,1,2,34.设有一个10阶的对称矩阵A,采用行优先压缩存储方式,a11为第一个元素,其存储地址为1,每个元素占一个字节空间,则a85的地址为()。
A.13B.18C.33D.40A.顺序文件B.索引文件C.散列文件D.倒排文件6.栈是一种操作受限的线性结构,其操作的主要特征是()。
A.先进先出B.后进先出C.进优于出D.出优于进7.对长度为15的有序顺序表进行二分查找,在各记录的查找概率均相等的情况下,查找成功时所需进行的关键字比较次数的平均值为()。
A.39/15B.49/15C.51/15D.55/158.若一棵二叉树的前序遍历序列与后序遍历序列相同,则该二叉树可能的形状是()。
A.树中没有度为 2的结点B.树中只有一个根结点C.树中非叶结点均只有左子树D.树中非叶结点均只有右子树9.若元素的入栈顺序为1,2,3....,n,如果第2个出栈的元素是n,则输出的第i(1A.n-iB..n-i+lC.n-i+2D.无法确定10.下列数据结构中,不属于二叉树的是()。
A.B树 B树是一种平衡的多叉树B. AVL树 AVL树是自平衡二叉查找树C.二叉排序树D.哈夫曼树哈夫曼树是最优二叉树11.若一个算法的时间复杂度用T(n)表示,其中n的含义是()。
第1章4.答案:(1)顺序存储结构顺序存储结构是借助元素在存储器中的相对位置来表示数据元素之间的逻辑关系,通常借助程序设计语言的数组类型来描述。
(2)链式存储结构顺序存储结构要求所有的元素依次存放在一片连续的存储空间中,而链式存储结构,无需占用一整块存储空间。
但为了表示结点之间的关系,需要给每个结点附加指针字段,用于存放后继元素的存储地址。
所以链式存储结构通常借助于程序设计语言的指针类型来描述。
5. 选择题(1)~(6):CCBDDA6.(1)O(1) (2)O(m*n) (3)O(n2)(4)O(log3n) (5)O(n2) (6)O(n)第2章1.选择题(1)~(5):BABAD (6)~(10):BCABD (11)~(15):CDDAC 2.算法设计题(1)将两个递增的有序链表合并为一个递增的有序链表。
要求结果链表仍使用原来两个链表的存储空间, 不另外占用其它的存储空间。
表中不允许有重复的数据。
[题目分析]合并后的新表使用头指针Lc指向,pa和pb分别是链表La和Lb的工作指针,初始化为相应链表的第一个结点,从第一个结点开始进行比较,当两个链表La和Lb均为到达表尾结点时,依次摘取其中较小者重新链接在Lc表的最后。
如果两个表中的元素相等,只摘取La表中的元素,删除Lb表中的元素,这样确保合并后表中无重复的元素。
当一个表到达表尾结点,为空时,将非空表的剩余元素直接链接在Lc表的最后。
void MergeList(LinkList &La,LinkList &Lb,LinkList &Lc){//合并链表La和Lb,合并后的新表使用头指针Lc指向pa=La->next; pb=Lb->next;//pa和pb分别是链表La和Lb的工作指针,初始化为相应链表的第一个结点Lc=pc=La; //用La的头结点作为Lc的头结点while(pa && pb){ if(pa->data<pb->data){pc->next=pa; pc=pa; pa=pa->next;}//取较小者La中的元素,将pa链接在pc的后面,pa指针后移else if(pa->data>pb->data) {pc->next=pb; pc=pb; pb=pb->next;}//取较小者Lb中的元素,将pb链接在pc的后面,pb指针后移else //相等时取La中的元素,删除Lb中的元素{pc->next=pa;pc=pa;pa=pa->next;q=pb->next; delete pb ; pb =q;}}pc->next=pa?pa:pb; //插入剩余段delete Lb; //释放Lb的头结点}(5)设计算法将一个带头结点的单链表A分解为两个具有相同结构的链表B、C,其中B表的结点为A表中值小于零的结点,而C表的结点为A表中值大于零的结点(链表A中的元素为非零整数,要求B、C表利用A表的结点)。
第1章概论1.数据、数据元素、数据结构、数据类型的含义分别是什么?数据:对客观事物的符号表示,在计算机科学中是指所有能输入到计算机中并由计算机程序处理的符号的总称。
数据元素:数据的基本单位,在计算机程序中通常作为一个整体考虑。
数据结构:数据元素之间的关系+运算,是以数据为成员的结构,是带结构的数据元素的集合,数据元素之间存在着一种或多种特定的关系。
数据类型:数据类型是用来区分不同的数据;由于数据在存储时所需要的容量各不相同,不同的数据就必须要分配不同大小的内存空间来存储,所有就要将数据划分成不同的数据类型。
数据类型包含取值范围和基本运算等概念。
2.什么是数据的逻辑结构?什么是数据的物理结构?数据的逻辑结构与物理结构的区别和联系是什么?逻辑结构:数据的逻辑结构定义了数据结构中数据元素之间的相互逻辑关系。
数据的逻辑结构包含下面两个方面的信息:①数据元素的信息;②各数据元素之间的关系。
物理结构:也叫储存结构,是指逻辑结构的存储表示,即数据的逻辑结构在计算机存储空间中的存放形式,包括结点的数据和结点间关系的存储表示。
数据的逻辑结构和存储结构是密不可分的,一个操作算法的设计取决于所选定的逻辑结构,而算法的实现依赖于所采与的存储结构。
采用不同的存储结构,其数据处理的效率是不同的。
因此,在进行数据处理时,针对不同问题,选择合理的逻辑结构和存储结构非常重要。
3.数据结构的主要操作包括哪些?对于各种数据结构而言,他们在基本操作上是相似的,最常用的操作有:●创建:建立一个数据结构;●清除:清除一个数据结构;●插入:在数据结构中增加新的结点;●删除:把指定的结点从数据结构中删除;●访问:对数据结构中的结点进行访问;●更新:改变指定结点的值或改变指定的某些结点之间的关系;●查找:在数据结构中查找满足一定条件的结点;●排序:对数据结构中各个结点按指定数据项的值,以升序或降序重新排列。
4.什么是抽象数据类型?如何定义抽象数据类型?抽象数据类型(Abstract Data Type 简称ADT)是指一个数学模型以及定义在此数学模型上的一组操作。
一、填空题01、当线性表的元素总数基本稳定,且很少进行插入和删除操作,但要求以最快的速度存取线性表中的元素时,应采用顺序存储结构。
02、线性表L=<a1,a2,…,an)用数组表示,假定删除表中任一元素的概率相同,则删除一个元素平均需要移动元素的个数是(n-1>/2。
b5E2RGbCAP03、在有n个元素的顺序表中插入一个新元素,需要平均移动n/2元素,具体移动的元素个数与表长和该元素在表中的位置有关。
p1EanqFDPw04、线性表中结点的集合是有限的,结点间的关系是一对一的。
05、向一个长度为n的顺序表的第i个元素(1≤i≤n+1>之前插入一个元素时,需向后移动n-i+1个元素。
DXDiTa9E3d06、向一个长度为n的顺序表中删除第i个元素(1≤i≤n>时,需向前移动n-i个元素。
07、在顺序表中访问任意一结点的时间复杂度均为O(1>,因此,顺序表也称为随机存取的数据结构。
08、顺序表中逻辑上相邻的元素的物理位置必定相邻。
单链表中逻辑上相邻的元素的物理位置未必相邻。
09、在单链表中,除了首结点外,任一结点的存储位置由其直接前驱结点的链域值指示。
10、在n个结点的单链表中要删除已知结点*p,需找到它的前驱结点的地址,其时间复杂度为O(n>。
11、设单链表的结点结构为(data,next>,next 为指针域,已知指针px指向单链表中data域为x的结点,指针py 指向data域为y的新结点,若将结点y插入结点x之后,则需要执行以下语句:py->next=px->next。
px->next=py。
RTCrpUDGiT12、在单链表中设置头结点的作用是使插入和删除等操作统一,在第一个元素之前插入元素和删除第一个结点不必另作判断。
5PCzVD7HxA13、对于一个具有n 个结点的单链表,在已知的结点*p后插入一个新结点的时间复杂度为O(1>,在给定值为x 的结点后插入一个新结点的时间复杂度为O(n>。
一、实验目的本次实验旨在让学生掌握数据结构的基本概念、逻辑结构、存储结构以及各种基本操作,并通过实际编程操作,加深对数据结构理论知识的理解,提高编程能力和算法设计能力。
二、实验内容1. 线性表(1)顺序表1)初始化顺序表2)向顺序表插入元素3)从顺序表删除元素4)查找顺序表中的元素5)顺序表的逆序操作(2)链表1)创建链表2)在链表中插入元素3)在链表中删除元素4)查找链表中的元素5)链表的逆序操作2. 栈与队列(1)栈1)栈的初始化2)入栈操作3)出栈操作4)获取栈顶元素5)判断栈是否为空(2)队列1)队列的初始化2)入队操作3)出队操作4)获取队首元素5)判断队列是否为空3. 树与图(1)二叉树1)创建二叉树2)遍历二叉树(前序、中序、后序)3)求二叉树的深度4)求二叉树的宽度5)二叉树的镜像(2)图1)创建图2)图的深度优先遍历3)图的广度优先遍历4)最小生成树5)最短路径三、实验过程1. 线性表(1)顺序表1)初始化顺序表:创建一个长度为10的顺序表,初始化为空。
2)向顺序表插入元素:在顺序表的第i个位置插入元素x。
3)从顺序表删除元素:从顺序表中删除第i个位置的元素。
4)查找顺序表中的元素:在顺序表中查找元素x。
5)顺序表的逆序操作:将顺序表中的元素逆序排列。
(2)链表1)创建链表:创建一个带头结点的循环链表。
2)在链表中插入元素:在链表的第i个位置插入元素x。
3)在链表中删除元素:从链表中删除第i个位置的元素。
4)查找链表中的元素:在链表中查找元素x。
5)链表的逆序操作:将链表中的元素逆序排列。
2. 栈与队列(1)栈1)栈的初始化:创建一个栈,初始化为空。
2)入栈操作:将元素x压入栈中。
3)出栈操作:从栈中弹出元素。
4)获取栈顶元素:获取栈顶元素。
5)判断栈是否为空:判断栈是否为空。
(2)队列1)队列的初始化:创建一个队列,初始化为空。
2)入队操作:将元素x入队。
3)出队操作:从队列中出队元素。
数据结构--线性表习题及答案第⼆章线性表⼀、选择题1、若长度为n的线性表采⽤顺序存储结构,在其第i个位置插⼊⼀个新元素算法的时间复杂度()。
A. O(log2n)B.O(1)C. O(n)D.O(n2)2、若⼀个线性表中最常⽤的操作是取第i个元素和找第i个元素的前趋元素,则采⽤()存储⽅式最节省时间。
A. 顺序表B. 单链表C. 双链表D. 单循环链表3、具有线性结构的数据结构是()。
A. 图B. 树C. ⼴义表D.栈4、在⼀个长度为n的顺序表中,在第i个元素之前插⼊⼀个新元素时,需向后移动()个元素。
A. n-iB. n-i+1C. n-i-1D. i5、⾮空的循环单链表head的尾结点p满⾜()。
A. p->next==headB. p->next==NULLC. p==NULLD. p==head6、链表不具有的特点是()。
A. 可随机访问任⼀元素B. 插⼊删除不需要移动元素C. 不必事先估计存储空间D. 所需空间与线性表长度成正⽐7、在双向循环链表中,在p指针所指的结点后插⼊⼀个指针q所指向的新结点,修改指针的操作是()。
A. p->next=q;q->prior=p;p->next->prior=q;q->next=q;B. p->next=q;p->next->prior=q;q->prior=p;q->next=p->next;C. q->prior=p;q->next=p->next;p->next->prior=q;p->next=q;D. q->next=p->next;q->prior=p;p->next=q;p->next=q;8、线性表采⽤链式存储时,结点的存储地址()。
A. 必须是连续的B. 必须是不连续的C. 连续与否均可D. 和头结点的存储地址相连续9、在⼀个长度为n的顺序表中删除第i个元素,需要向前移动()个元素。
第2章线性表典型例题解析一、选择题1.线性表是具有n个(n≥0)的有限序列。
A.表元素B.字符C.数据元素D.数据项【分析】线性表是具有相同数据类型的n(n≥0)个数据元素的有限序列,通常记为(a1,a2,…,a n),其中n为表长,n=0时称为空表。
【答案】C2.顺序存储结构的优点是。
A.存储密度大B.插入运算方便C.删除运算方便D.可方便地用于各种逻辑结构的存储表示【分析】顺序存储结构是采用一组地址连续的存储单元来依次存放数据元素,数据元素的逻辑顺序和物理次序一致。
因此,其存储密度大。
【答案】A3.带头结点的单链表head为空的判断条件是。
A.head==NULL B.head->next==NULLC.head->next==head D.head!=NULL【分析】链表为空时,头结点的指针域为空。
【答案】B4.若某线性表中最常用的操作是在最后一个元素之后插入一个元素和删除第一个元素,则采用存储方式最节省运算时间。
A.单链表B.仅有头指针的单循环链表C.双链表D.仅有尾指针的单循环链表【分析】根据题意要求,该线性表的存储应能够很方便地找到线性表的第一个元素和最后一个元素,A和B都能很方便地通过头指针找到线性表的第一个元素,却要经过所有元素才能找到最后一个元素;选项C双链表若存为双向循环链表,则能很方便地找到线性表的第一个元素和最后一个元素,但存储效率要低些,插入和删除操作也略微复杂;选项D可通过尾指针直接找到线性表的最后一个元素,通过线性表的最后一个元素的循环指针就能很方便地找到第一个元素。
【答案】D5.若某线性表最常用的操作是存取任一指定序号的元素和在最后进行插入和删除运算,则利用存储方式最节省时间。
A.顺序表B.双链表C.带头结点的双循环链表D.单循环链表【分析】某线性表最常用的操作是存取任一指定序号的元素和在最后进行插入和删除运算。
因此不需要移动线性表种元素的位置。
根据题意要求,该线性表的存储应能够很方便地找到线性表的任一指定序号的元素和最后一个元素,顺序表是由地址连续的向量实现的,因此具有按序号随机访问的特点。
《数据结构》填空作业题答案第1章绪论(已校对无误)1.数据结构包括数据的逻辑结构、数据的存储结构和数据的运算三方面的内容。
2.程序包括两个内容:数据结构和算法。
3. 数据结构的形式定义为:数据结构是一个二元组:Data Structure =(D,S)。
4. 数据的逻辑结构在计算机存储器内的表示,称为数据的存储结构。
5. 数据的逻辑结构可以分类为线性结构和非线性结构两大类。
6. 在图状结构中,每个结点的前驱结点数和后继结点数可以有多个。
7. 在树形结构中,数据元素之间存在一对多的关系。
8. 数据的物理结构,指数据元素在计算机中的标识(映象),也即存储结构。
9. 数据的逻辑结构包括线性结构、树形结构和图形结构3种类型,树型结构和有向图结构合称为非线性结构。
10. 顺序存储结构是把逻辑上相邻的结点存储在物理上连续的存储单元里,结点之间的逻辑关系由存储单元位置的邻接关系来体现。
11. 链式存储结构是把逻辑上相邻的结点存储在物理上任意的存储单元里,节点之间的逻辑关系由附加的指针域来体现。
12. 数据的存储结构可用4种基本的存储方法表示,它们分别是顺序存储、链式存储、索引存储和散列存储。
13. 线性结构反映结点间的逻辑关系是一对一的,非线性结构反映结点间的逻辑关系是一对多或多对多。
14. 数据结构在物理上可分为顺序存储结构和链式存储结构。
15. 我们把每种数据结构均视为抽象类型,它不但定义了数据的表示方式,还给出了处理数据的实现方法。
16. 数据元素可由若干个数据项组成。
17. 算法分析的两个主要方面是时间复杂度和空间复杂度。
18. 一个算法的时间复杂度是用该算法所消耗的时间的多少来度量的,一个算法的空间复杂度是用该算法在运行过程中所占用的存储空间的大小来度量的。
19. 算法具有如下特点:有穷性、确定性、可行性、输入、输出。
20. 对于某一类特定的问题,算法给出了解决问题的一系列操作,每一操作都有它的确切的定义,并在有穷时间内计算出结果。
File chainNode.h#ifndef chainNode_#define chainNode_template<class T>struct chainNode{// data membersT element;chainNode<T> *next;// methodschainNode() {next=NULL;}chainNode(const T& element){this->element = element;this->next=NULL;}chainNode(const T& element, chainNode<T>* next) {this->element = element;this->next = next;}};#endifFile linnerList.h// abstract class linearList// abstract data type specification for linear list data structure// all methods are pure virtual functions#ifndef linearList_#define linearList_#include <iostream>using namespace std;template<class T>class linearList{public:virtual ~linearList() {};virtual bool empty() const = 0;// return true iff list is emptyvirtual int size() const = 0;// return number of elements in listvirtual T& get(int theIndex) const = 0;// return element whose index is theIndex virtual int indexOf(const T& theElement) const = 0;// return index of first occurence of theElement virtual void erase(int theIndex) = 0;// remove the element whose index is theIndex virtual void insert(int theIndex, const T& theElement) = 0;// insert theElement so that its index is theIndex virtual void output(ostream& out) const = 0;// insert list into stream out};#endifFile circularListWithHeader.h// circularList list with header node and iterator#ifndef circularListWithHeader_#define circularListWithHeader_#include<iostream>#include<sstream>#include<string>#include"chainNode.h"#include"myExceptions.h"#include"linearList.h"usingnamespace std;template<class T>class circularListWithHeader{public:// 构造函数circularListWithHeader();// some methodsbool empty(){return listSize = 0;}int size() const {return listSize;}T&get(int theIndex) const;int indexOf(const T& theElement) const;void erase(int theIndex);void insert(int theIndex, const T& theElement);void output(ostream& out) const;void reverse();// iterators to start and end of listclass iterator;iterator begin() {return iterator(headerNode->next);}iterator end() {return iterator(headerNode);}// iterator for chainclass iterator{public:// typedefs required by C++ for a forward iteratortypedef forward_iterator_tagiterator_category;typedef T value_type;typedef ptrdiff_tdifference_type;typedef T* pointer;typedef T&reference;// 构造函数iterator(chainNode<T>* theNode = NULL){node = theNode;}// 解引用操作符T&operator*() const {return node->element;}T* operator->() const {return&node->element;}// 迭代器加法操作iterator&operator++() // preincrement{node = node->next; return *this;} iterator operator++(int) // postincrement{iterator old = *this;node = node->next;return old;}// 相等检验bool operator!=(const iterator right) const{return node != right.node;}bool operator==(const iterator right) const{return node == right.node;}protected:chainNode<T>* node;}; // end of iterator classprotected:void checkIndex(int theIndex) const;// 如果索引无效,抛出异常chainNode<T>* headerNode; // 指向链表第一个元素的指针int listSize; // 元素个数};template<class T>circularListWithHeader<T>::circularListWithHeader(){// 构造函数headerNode = new chainNode<T>();headerNode->next = headerNode;listSize = 0;}template<class T>void circularListWithHeader<T>::checkIndex(int theIndex) const {// 确定 theIndex在 0和listSize - 1之间转换.if (theIndex < 0 || theIndex >= listSize){ostringstream s;s <<"index = "<< theIndex <<" size = "<<listSize;throw illegalIndex(s.str());}}template<class T>T&circularListWithHeader<T>::get(int theIndex) const{checkIndex(theIndex);chainNode<T>* currentNode = headerNode->next;for(int i = 0;i<theIndex;i++)currentNode = currentNode->next;return currentNode->element;}template<class T>int circularListWithHeader<T>::indexOf(const T& theElement) const {// Return元素theElement首次出现时的索引.// 如果不存在Return -1 .//将theElement放入headerNodeheaderNode->element = theElement;// 在链表中寻找 theElementchainNode<T>* currentNode = headerNode->next;//指向链表的第一个int index = 0; // 返回的索引,从0开始计数while (currentNode->element != theElement){// 移动到下一节点currentNode = currentNode->next;index++;}// 确定是否找到elementif (currentNode == headerNode)return -1;elsereturn index;}template<class T>void circularListWithHeader<T>::erase(int theIndex){// Delete索引为theIndex的元素.// 如果不存在这样的元素就抛出异常.checkIndex(theIndex);//索引有效,需找要删除的元素节点chainNode<T>* deleteNode;// use p 指向要删除节点的前驱结点chainNode<T>* p = headerNode->next;for(int i = 0;i < theIndex - 1;i++)p = p->next;deleteNode = p->next;p->next = p->next->next;// 删除 deleteNode指向的节点listSize--;delete deleteNode;}template<class T>void circularListWithHeader<T>::insert(int theIndex, const T& theElement) {// Insert theElement so that its index is theIndex.if (theIndex < 0 || theIndex >listSize){// 无效索引ostringstream s;s <<"index = "<< theIndex <<" size = "<<listSize;throw illegalIndex(s.str());}// find 新元素前驱chainNode<T>* p = headerNode;for (int i = 0; i < theIndex; i++)p = p->next;// insert after pp->next = new chainNode<T>(theElement, p->next);listSize++;}template<class T>void circularListWithHeader<T>::output(ostream& out) const{// 把链表放入输出流.for (chainNode<T>* currentNode = headerNode->next;currentNode != headerNode;currentNode = currentNode->next)out << currentNode->element<<"";}// overload <<template<class T>ostream&operator<<(ostream& out, const circularListWithHeader<T>& x) {x.output(out); return out;}template<class T>void circularListWithHeader<T>::reverse(){if(listSize<= 1) return;chainNode<T>*currentNode = headerNode->next,*nextNode,*lastNode = headerNode;while(currentNode != headerNode){nextNode = currentNode->next;currentNode->next = lastNode;lastNode = currentNode;currentNode = nextNode;}headerNode->next = lastNode;}File circularListWithHeader.cpp// test the class circularListWithHeader#include<iostream>#include"circularListWithHeader.h"#include<numeric>usingnamespace std;int main(){// test constructorcircularListWithHeader<int> y;// test sizecout <<"Initial size of y ="<< y.size() <<endl;// test inserty.insert(0, 2);y.insert(1, 6);y.insert(0, 1);y.insert(2, 4);y.insert(3, 5);y.insert(2, 3);cout <<"Inserted 6 integers, list y should be 1 2 3 4 5 6"<<endl;cout <<"Size of y = "<< y.size() <<endl;y.output(cout);cout <<endl<<"Testing overloaded <<"<<endl;cout << y <<endl;// test iteratorcout <<endl<<"Ouput using forward iterators pre and post ++"<<endl; for (circularListWithHeader<int>::iterator i = y.begin();i != y.end(); i++)cout << *i <<"";cout <<endl;for(circularListWithHeader<int>::iterator i = y.begin();i != y.end(); ++i){cout << *i <<"";*i += 1;}cout <<endl;// test indexOfint index = y.indexOf(4);if (index < 0) cout <<"4 not found"<<endl;else cout <<"The index of 4 is "<< index <<endl;index = y.indexOf(7);if (index < 0) cout <<"7 not found"<<endl;else cout <<"The index of 7 is "<< index <<endl;int sum = accumulate(y.begin(), y.end(), 0);//初始值是0cout <<"The sum of the elements is "<< sum <<endl;//test reversey.reverse();cout<<y<<endl;return 0;}#endifFile myExceptions.h// exception classes for various error types#ifndef myExceptions_#define myExceptions_#include<string>usingnamespace std;// illegal parameter valueclass illegalParameterValue{public:illegalParameterValue(string theMessage = "Illegal parameter value") {message = theMessage;}void outputMessage() {cout <<message<<endl;}private:string message;};// illegal input dataclass illegalInputData{public:illegalInputData(string theMessage = "Illegal data input"){message = theMessage;}void outputMessage() {cout <<message<<endl;}private:string message;};// illegal indexclass illegalIndex{public:illegalIndex(string theMessage = "Illegal index"){message = theMessage;}void outputMessage() {cout <<message<<endl;}private:string message;};// matrix index out of boundsclass matrixIndexOutOfBounds{public:matrixIndexOutOfBounds(string theMessage = "Matrix index out of bounds") {message = theMessage;}void outputMessage() {cout <<message<<endl;}private:string message;};// matrix size mismatchclass matrixSizeMismatch{public:matrixSizeMismatch(string theMessage ="The size of the two matrics doesn't match"){message = theMessage;}void outputMessage() {cout <<message<<endl;}private:string message;};// stack is emptyclass stackEmpty{public:stackEmpty(string theMessage ="Invalid operation on empty stack"){message = theMessage;}void outputMessage() {cout <<message<<endl;} private:string message;};// queue is emptyclass queueEmpty{public:queueEmpty(string theMessage ="Invalid operation on empty queue"){message = theMessage;}void outputMessage() {cout <<message<<endl;} private:string message;};// hash table is fullclass hashTableFull{public:hashTableFull(string theMessage ="The hash table is full"){message = theMessage;}void outputMessage() {cout <<message<<endl;} private:string message;};// edge weight undefinedclass undefinedEdgeWeight{public:undefinedEdgeWeight(string theMessage = "No edge weights defined"){message = theMessage;}void outputMessage() {cout <<message<<endl;} private:string message;};// method undefinedclass undefinedMethod{public:undefinedMethod(string theMessage ="This method is undefined"){message = theMessage;}void outputMessage() {cout <<message<<endl;} private:string message;};#endif。