实验2链表的应用
实验目的
1.定义单链表的结点类型。
2.熟悉对单链表的一些基本操作和具体的函数定义。
3.通过单链表的定义掌握线性表的链式存储结构的特点。
4.熟悉单链表的应用场合。
实验要求
1.独立完成;
2.程序调试正确,有执行结果。
实验内容
1、基础题:
线性表基本操作的实现(演示单链表的创建、插入、删除和查找等操作),并请将链式存储结构的程序存放在文件link.h(基本操作函数)、link.cpp(主函数)中。
(要求有简单实例测试算法的正确性)
2、提高题:
编写程序,模拟约瑟夫环(josephus)问题:
n个人(编号为1,2,3,……,n(n>0))按顺时针方向围坐一圈,每人持有一个正整数密码。
开始时任意给出两个值:
一个为首先报数的人的编号i(0
接着从编号为i的人开始按顺时针方向自1起顺序报数,报到m时停止报数,且报到m的人出列,并将他的密码作为新的m值,从他在顺时针方向上的下一个人起重新自1报数,……,如此下去,直到所有人全部出列为止。
要求设计一个程序模拟此过程,给出出列人的编号序列。
基本要求:
人数n、每人的正整数密码、首次报数人编号i、初始报数上限值m均由键盘输入。
实验3栈的应用
实验目的
1.会定义顺序栈和链栈的结点类型。
2.掌握栈的插入和删除结点在操作上的特点。
3.熟悉对栈的一些基本操作和具体的函数定义。
实验要求
1.独立完成;
2.程序调试正确,有执行结果。
实验内容
1、基础题:
设栈采用顺序存储结构(用动态数组),请编写栈的各种基本操作的实现函数,并存放在头文件stack.h中。
同时建立一个验证操作实现的主函数文件stack.cpp,编译并调试程序,直到正确运行。
提示:
⑴栈的动态数组顺序存储结构可定义如下:
structStack{
ElemType*stack;//存栈元素
inttop;//栈顶指示器
intMaxSize;//栈的最大长度
};
⑵栈的基本操作可包括:
①voidInitStack(Stack&S);//构造一个空栈S
②intEmptyStack(StackS);//若栈S为空栈返回1,否则返回0
③voidPush(Stack&S,ElemTypeitem);//元素item进栈
④ElemTypePop(Stack&S);//栈S的栈顶元素出栈并返回
⑤ElemTypePeek(StackS);//取栈S的当前栈顶元素并返回
⑥voidClearStack(Stack&S);//清除栈s,使成为空栈
2、应用题:
写一函数,判断给定的字符串是否中心对称。
如字符串“abcba”、“abccba”均为中心对称,字符串“abcdba”不中心对称。
要求利用stack.h中已实现的有关栈的基本操作函数来实现。
请把该函数添加到文件stack.cpp中的主函数前,并在主函数中添加相应语句进行测试。
函数原型如下:
intIsReverse(char*s)//判断字符串S是否中心对称,是返回1,否则返回0
实验4队列的应用
实验目的
1.掌握队列的存储结构及基本操作。
2.掌握循环队列的设置及循环队列的各种基本操作的实现。
3.通过具体的应用实例,进一步熟悉和掌握队列的实际应用。
实验要求
1.独立完成;
2.程序调试正确,有执行结果。
实验内容
1、基础题:
建立头文件queue.h,定义顺序存储的循环队列存储结构,并编写循环队列的各种基本操作实现函数。
同时建立一个验证操作实现的主函数文件queue.cpp,编译并调试程序,直到正确运行。
说明:
队列的基本操作可包括:
①voidInitQueue(Queue&Q);//构造一个空队列Q
②intEmptyQueue(QueueQ);
//判断队列Q是否为空,若空返回1,否则返回0
③voidEnQueue(Queue&Q,ElemTypeitem);//元素item进队列Q
④ElemTypeOutQueue(Queue&Q);//队头元素出队列Q,并返回其值
⑤ElemTypePeekQueue(QueueQ);//返回队头元素值
⑥voidClearQueue(Queue&Q);//清空队列
2、应用(选做部分):
编写程序,实现舞伴问题:
假设在周末舞会上,男士们和女士们进入舞厅时,各自排成一队,跳舞开始时,依次从男队和女队的队头上各出一人配成舞伴,若两队初始人数不相同,则较长的那一队中未配对者等待下一轮舞曲。
现要求设计一个函数voidpartner(),模拟上述舞伴配对问题。
基本要求:
1)由键盘输入数据,每对数据包括姓名和性别;
2)输出结果包括配成舞伴的女士和男士的姓名,以及未配对者的队伍名称和队头者的姓名;
3)要求利用queue.h中已实现的顺序循环队列的基本操作函数来实现。
函数voidpartner()添加到文件queue.cpp中,在主函数中进行调用测试。
实验5树的应用
实验目的
1.熟悉二叉树结点的结构和对二叉树的基本操作。
2.掌握对二叉树每一种操作的具体实现。
3.学会利用递归方法编写对二叉树这种递归数据结构进行处理的算法。
4.在二叉树基本操作的基础上掌握对二叉树的一些其它操作的具体实现方法。
5.掌握构造哈夫曼树以及哈夫曼编码的方法。
实验要求
1.独立完成;
2.程序调试正确,有执行结果。
实验内容
1、基础题:
建立头文件tree.h,在该文件中定义二叉树的链式存储结构,并编写二叉树的各种基本操作实现函数。
同时建立一个验证操作实现的主函数文件tree.cpp,编译并调试程序,直到正确运行。
注意,需要用到栈和队列的有关操作,可使用已编制过的栈和队列的基本操作文件stack.h、queue.h来实现。
说明:
二叉树的基本操作可包括:
(1)voidInitBTree(BTreeNode*&BT)//初始化二叉树BT
(2)voidCreateBTree(BTreeNode*&BT,char*a)
//根据字符串a所给出的广义表表示的二叉树建立二叉链表存储结构
(3)intEmptyBTree(BTreeNode*BT)
//检查二叉树BT是否为空,空返回1,否则返回0
(4)intDepthBTree(BTreeNode*BT)//求二叉树BT的深度并返回该值
(5)intFindBTree(BTreeNode*BT,ElemTypex)
//查找二叉树BT中值为x的结点,若查找成功返回1,否则返回0
2、提高部分:
(6)voidPreOrder(BTreeNode*BT)//先序遍历二叉树BT
(7)voidInOrder(BTreeNode*BT)//中序遍历二叉树BT
(8)voidPostOrder(BTreeNode*BT)//后序遍历二叉树BT
(9)voidLevelOrder(BTreeNode*BT)//按层次遍历二叉树BT
(10)voidPrintBTree(BTreeNode*BT)//输出二叉树BT
(11)voidClearBTree(BTreeNode*&BT)//清除二叉树BT
实验6图的应用
实验目的
1.掌握图的各种存储结构,特别要熟练掌握邻接矩阵和邻接表存储结构。
2.遍历是图各种应用的算法的基础,要熟练掌握图的深度优先遍历和广度优先遍历算法,复习栈和队列的应用。
实验要求
1.独立完成;
2.程序调试正确,有执行结果。
实验内容(2选1)
1、图的邻接矩阵定义及实现:
建立头文件AdjM.h,在该文件中定义图的邻接矩阵存储结构,并编写图的初始化、建立图、输出图、输出图的每个顶点的度等基本操作实现函数。
同时建立一个验证操作实现的主函数文件AdjM.cpp(以下图为例),编译并调试程序,直到正确运行。
2、图的邻接表的定义及实现:
建立头文件AdjL.h,在该文件中定义图的邻接表存储结构,并编写图的初始化、建立图、输出图、输出图的每个顶点的度等基本操作实现函数。
同时在主函数文件AdjL.cpp中调用这些函数进行验证(以下图为例)。
实验7图的应用
实验目的
1.掌握以邻接矩阵作为存储结构的生成图的最小生成树的普里姆算法。
2.掌握以邻接矩阵作为存储结构的生成图的最小生成树的克鲁斯卡尔算法。
实验要求
1.独立完成;
2.程序调试正确,有执行结果。
实验内容
1、编写用邻接矩阵表示无向带权图时图的基本操作的实现函数,主要包括:
①初始化邻接矩阵表示的无向带权图voidInitMatrix(adjmatrixG);②建立邻接矩阵表示的无向带权图voidCreateMatrix(adjmatrixG,intn)(即通过输入图的每条边建立图的邻接矩阵);③输出邻接矩阵表示的无向带权图voidPrintMatrix(adjmatrixG,intn)(即输出图的每条边)。
把邻接矩阵的结构定义以及这些基本操作实现函数存放在头文件Graph1.h中。
2、编写生成最小生成树的Prim算法函数voidPrim(adjmatrixG,edgsetCT,intn)以及输出边集数组的函数voidPrintEdge(edgesetCT,intn)。
3、编写测试程序(即主函数),通过调用上述函数首先建立并输出无向带权图,然后生成最小生成树并输出(即输出边集)。
要求:
把边集数组的结构定义、Prim算法函数、输出边集数组的函数PrintEdge以及主函数存放在文件Gragh1.cpp中。
测试数据如下:
实验8查找与排序
实验目的
1.熟悉并掌握各种查找算法
2.掌握排序的基本概念。
3.熟悉各种内部排序的方法。
实验要求
1.独立完成;
2.程序调试正确,有执行结果。
实验内容
编写程序,完成以下任务:
a)通过键盘输入n个学生的考试成绩表(设计为一个线性表),表中每个元素由姓名与分数组成;
b)按分数高低次序,打印出每个学生在考试中获得的名次,分数相同的为同一名次;
c)按名次打印出每个学生的姓名与分数。
要求:
选用二种排序算法分别实现该程序中的排序要求,二种排序算法存放在头文件sort.h中。
在主函数中首先输入数据,然后调用排序函数排序,并按分数高低次序打印名次与成绩表,主函数存放在文件sort.cpp中。