1、数据结构与算法课程设计数据结构与算法课程设计实习一需求规格说明1、单链表的输出要求:使用“递归”算法实现单链表中数据的顺序和逆序输出,但不允许引入额外的空间复杂度。总体分析与设计利用链表的存储结构,并采用递归的思想;主函数 void OpSeqOutput(int n) void SeqOutput() 利用主函数调用void OpSeqOutput(int n)和void SeqOutput()实现数序列逆序和顺序输出;编码void SeqOutput()利用递归的方法,输出头结点后,删除该节点;void OpSeqOutput(int n)利用递归的方法,为尾节点计数,并依次逆序输出;程序
2、及算法分析输入n个数进行测试,输出结果:List is: 5 4 9 8 7 4 5 6 7 8 9 6 8 6 4 5 6 7 5 3 9 8 7 6 5 4 2 6 4 2 9 8 2 5 4 3 2 1 5 4 9 8 7 4 5 6 7 8 9 6 8 6 4 5 6 7 5 3 9 8 7 6 5 4 2 6 4 2 9 8 2 5 4 3 2 1 5 4 9 8 7 4 5 6 7 8 9 6 8 6 4 5 6 7 5 3 9 8 7 6 5 4 2 6 4 2 9 8 2 5 4 3 2 1List sequence reverse output:1 2 3 4 5 2 8 9
3、 2 4 6 2 4 5 6 7 8 9 3 5 7 6 5 4 6 8 6 9 8 7 6 5 4 7 8 9 4 5 1 23 4 5 2 8 9 2 4 6 2 4 5 6 7 8 9 3 5 7 6 5 4 6 8 6 9 8 7 6 5 4 7 8 9 4 5 1 2 3 45 2 8 9 2 4 6 2 4 5 6 7 8 9 3 5 7 6 5 4 6 8 6 9 8 7 6 5 4 7 8 9 4 5List sequence output:5 4 9 8 7 4 5 6 7 8 9 6 8 6 4 5 6 7 5 3 9 8 7 6 5 4 2 6 4 2 9 8 2 5 4
4、 3 2 1 5 49 8 7 4 5 6 7 8 9 6 8 6 4 5 6 7 5 3 9 8 7 6 5 4 2 6 4 2 9 8 2 5 4 3 2 1 5 4 9 87 4 5 6 7 8 9 6 8 6 4 5 6 7 5 3 9 8 7 6 5 4 2 6 4 2 9 8 2 5 4 3 2 1请按任意键继续. . .采用递归的方法,如果数序列较大,则时间复杂度较大;小结利用递归的方法空间复杂度较小;附录void Chain:SeqOutput() ChainNode *current=first; if(current) int i=0; T x; coutdata ; i+
5、; Delete(i,x); SeqOutput(); else coutendl; /*coutList sequence sequence output over!endl;*/逆序输出template void Chain:OpSeqOutput(int n) ChainNode *current=first; ChainNode *trail; if(first & n0) for(int i=0;current&ilink; coutdata ; OpSeqOutput(n-1); /*coutList sequence reverse output over!endl;*/ 实习二
6、需求规格说明2、二值图像的像元分组算法简介:二值图像中每个元素的值只能为1或0,其中1表示有效像元,0表示图像的背景。如果一个元素在另外一个元素的上、下、左、右四个方向,称两个元素为相邻元素。“像元分组”算法是将二值图像中处于相邻的元素进行分组标号,使得属于同一个分组的像元集合,其编号都相同。如下图所示:110000110000000100001101001001000001110000110000000200002203002003000003 分组前 分组后 要求:使用“队列”来实现二值图像的像元分组,图像数据采用TXT文件形式给出,把分组结果图像输出到另外一个文件总体分析与设计利用队列的
7、存储结构;数字化图像是一个m*n的像素矩阵。识别图元就是对元像素进行标记,当且仅当两个像素属于同一图元时,它们的标号相同;在识别图元的过程中,图像的周围包上一圈空白像素(即0像素);采用数组0offset来确定与一个给定像素相邻的像素。通过逐行扫描像素来识别图元。当遇到一个没有标号的图元的像素时,就给它指定一个图元编号(使用数字2、3、等为图元编号),该像素就为一个新图元种子,通过识别和标记与种子相邻的所有图元像素,可以确定图元中的其它像素。编码先在图像外围包上一圈背景像素,并对offset进行初始化,接下来的两个for循环通过扫描图像寻找下一个图元的种子。再图元标号设置为种子标号,接下来借助
8、于链表队列的帮助,可以识别出该图元的其余像素。程序及算法分析1091 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 3 3 3 3 3 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 3 3 3 0 0 1 1 0 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 5 5 5 0 0 1 1 1 0 0 0 0
9、 0 0 6 6 6 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 7 0 0 0 0 0 0 1 1 1 0 1 0 0 0 0 7 7 7 0 8 0 对于任一个图元来说,识别标记该图元的的每个像素(种子除外)所需时间为O(cnum),识别并标记所有非种子图元像素所需要的总时间为()。小结其存储方式可以用公式化队列,链表堆栈,或公式化堆栈。附录#include stdafx.h#include Disgra.h#include #include using namespace std;#define max 40int _tmain(int argc, _TC
10、HAR* argv) ifstream f1(data.txt,ios:_Nocreate); Disgra D; /创建Disgra的对象D D.pixel; int rows(0),cols(0); f1rowscols; /读入行数和列数 int n(0); for(int i=0;irows;i+) for(int j=0;jn; /读入像元数据,并存入pixel数组 D.pixelij=n; f1.close(); D.Lable(rows,cols); /调用函数Lable ofstream f2(data2.txt,ios:out); int l(0); /计数 for(int
11、i=0;irows;i+) for(int j=0;jcols;j+) l+; f2D.pixelij ; /输出被标记的像元 if(l=9) f2endl; l=0; f2.close(); return 0;#ifndef Disgra_#define Disgra_#include positoin.h#include lqueue.h#define MAXSIZE 50struct Disgra int pixelMAXSIZEMAXSIZE; /存储数据的二维数组 void Lable(int rows,int cols);/标记函数;void Disgra:Lable(int ro
12、ws,int cols) /*int pixelMAXSIZEMAXSIZE;*/ /*int rows(0),cols(0);*/ for(int i=0;i=cols;i+) pixel0i=pixelrows+1i=0; for(int i=0;irows;i+) pixeli0=pixelicols+1=0; Position offset4; offset0.row=0;offset0.col=1; offset1.row=1;offset1.col=0; offset2.row=0;offset2.col=-1; offset3.row=-1;offset3.col=0; int
13、NumOfNbrs=4; LinkedQueue Q; int id=1; Position here,nbr; for(int r=1;r=rows;r+) for(int c=1;c=cols;c+) if(pixelrc=1) pixelrc=+id; here.row=r;here.col=c; do for(int i=0;iNumOfNbrs;i+) nbr.row=here.row+offseti.row; nbr.col=here.col+offseti.col; if(pixelnbr.rownbr.col=1) pixelnbr.rownbr.col=id; Q.Add(n
14、br); if(Q.IsEmpty()break; Q.Delete(here); while(true); #endif实习三需求规格说明3、课程安排问题一套好的课程体系有如下要求:各个课程之间有着严格的先后顺序关系;两个相邻课程之间的跨度为一个时间段(具体就是一个学期)。课程安排问题,是为了验证专业课程安排方案是否合理,并提供多种选课方案供学生进行选择。现有软件工程专业课程表(采用TXT文件格式),格式如下:课程代号 课程名称 先修课程代号11049 高等代数C25003 计算机高级语言22222 计算机导论33333 计算机结构与组成 25003,22222要求:使用“拓扑排序”算法,设
15、计一个程序:(1)验证软件工程专业课程表是否合理?若不合理,指出并修改不合理的课程安排,产生新的软件工程专业课程表;(2)对软件工程专业课程表,输出多种选课方案,以供学生进行选择。总体分析与设计利用图和栈存储结构;并利用贪婪算法来求解问题;有向图的顶点代表任务,有向边(,)表示先后关系,任务开始前任务必须完成。利用数组来描述课程,用一个栈来保存可加入的候选点,并用一维数组,表示与顶点相连的节点数目,其中顶点不是中的成员,它们之间有向图得边为(,),当变为时,表示成为一个候选点。序列初始时为空。为顶点的入度。每次向中加入一个顶点时,所有与新加入顶点临接的顶点,其减主函数bool Topologi
16、cal(int v)S.Add(i)Begin(w)S.Delete(w)NextVertex(w)编码每一步,从栈中去出一个顶点将其加入,同时减去与其邻接的顶点的值。程序及算法分析测试数据:课程代号 课程名称 先修课程代号11049 高等代数C25003 计算机高级语言22222 计算机导论33333 计算机结构与组成 25003,2222244444 软件工程概论 2222255555 面向对象程序设计 2500311016 离散数学 11049,2500325057 数据结构与算法 11016,2500366666 操作系统 33333,2505770000 计算机网络 25057700
17、10 统一建模语言 44444,5555570020 软件需求 4444470030 软件测试 4444470040 软件过程与管理 70020,7003070050 软件项目管理 7004070060 软件能力成熟度模型 70050运行结果:软公选课课程推荐表:课程代号 课程名称22222 计算机导论25003 计算机高级语言33333 计算机结构与组成11049 高等代数C11016 离散数学55555 面向对象程序设计25057 数据结构与算法66666 操作系统44444 软件工程概论70010 统一建模语言70020 软件需求70030 软件测试70040 软件过程与管理70050
18、软件项目管理70060 软件能力成熟度模型70000 计算机网络第一和第三个循环的时间开销为(),利用邻接矩阵,改程序的时间复杂度为()小结当算法失败时,有向图没有拓扑序列,若算法没有失败,则为一个拓扑序列。附录bool Network:Topological(int v)/ Compute topological ordering of digraph vertices. / Return true if a topological order is found. / In this case return the order in v0:n-1. / Return false if the
19、re is no topological order. int n = Vertices(); / Compute in-degrees int *InDegree = new int n+1; InitializePos(); / graph iterator array for (int i = 1; i = n; i+) / initialize InDegreei = 0; for (int i = 1; i = n; i+) / edges out of i int u = Begin(i); while (u) InDegreeu+; u = NextVertex(i); / St
20、ack vertices with zero in-degree LinkedStack S; for (int i = 1; i = n; i+) if (!InDegreei) S.Add(i); / Generate topological order int i = 0; / cursor for array v while (!S.IsEmpty() / select from stack int w; / next vertex S.Delete(w); vi+ = w; int u = Begin(w); while (u) / update in-degrees InDegre
21、eu-; if (!InDegreeu) S.Add(u); u = NextVertex(w); DeactivatePos(); delete InDegree; return (i = n);/ CourseSequence.cpp : 定义控制台应用程序的入口点。/#include stdafx.h#include course.h#include #include using namespace std;#include ldigraph.hint _tmain(int argc, _TCHAR* argv) ifstream f1(data.txt,ios:_Nocreate);
22、int n=0; /读取文件 f1n; int *T=new intn+1; /*for(int i=0;in;i+) Ti=0; */ course* Mycou=new coursen+1; /*course* T_Mycou=new couresn+1;*/ for(int i=0;iMycoui.vMycoui.numMycoui.nameMycoui.fnum1; else if(i=0|i=1|i=2) f1Mycoui.vMycoui.numMycoui.name; else f1Mycoui.vMycoui.numMycoui.nameMycoui.fnum1Mycoui.fn
23、um2; f1.close(); /初始化图 LinkedDigraph DG(n); for(int i=0;in;i+) if(Mycoui.v=10|Mycoui.v=12|Mycoui.v=13|Mycoui.v=15|Mycoui.v=16) DG.Add(Mycoui.fnum1,Mycoui.v); else if(Mycoui.v=1|Mycoui.v=2|Mycoui.v=3) continue; else DG.Add(Mycoui.fnum1,Mycoui.v); DG.Add(Mycoui.fnum2,Mycoui.v); /*cout The graph is end
24、l; DG.Output();*/ DG.Topological(T);/拓扑排序 ofstream f2(data1.txt,ios:out); f2软公选课课程推荐表:endl; f2课程代号 课程名称endl; /输出排序后课表 for(int i=0;in;i+) f2MycouTi-1.num MycouTi-1.nameendl; f2.close(); return 0; 实习四需求规格说明电话簿软件的实现(动态查找表算法的应用)【问题描述】 在很多实际应用中,动态索引结构在文件创建或初始装入记录时生成,在系统运行过程中插入或删除记录时,为了保持较好的检索性能,索引结构本身将随之
25、发生改变。教材上已经介绍的动态查找数据结构包括:二叉搜索树(BST)、平衡二叉树(AVL)、红黑树(RBT)、B-树。本题要求选取一种已经学过的动态搜索树结构,设计并实现一个手机电话薄软件。【基本要求】一个完整的电话簿软件应具有以下功能:(1)支持复式电话簿数据的存储,数据条目不少于500条。每个人名下可保存的信息包括:姓名、手机号码、住宅电话号码、办公电话号码、电子邮件地址、所属群组、备忘录等。(2)支持电话簿记录的添加、删除、编辑等操作。(3)将不同类型的人群按照同事、朋友、家人、商务伙伴等分组,支持群组记录的添加、删除、编辑等操作。(4)支持所有电话簿记录的导入、导出操作,外部数据采用T
26、XT格式。(5)支持电话簿记录的各种查询操作,具体包括: 逐条翻看能显示所有的电话簿记录,支持分屏查看。 电话号码查找输入一个电话号码(手机、住宅、办公),能将包含该号码的电话簿记录显示出来。 人名查找 输入一个人名(全名或者部分名),能将包含该姓名的电话簿记录显示出来。 群组查找 选择一种群组类型,能将属于该群组的所有电话簿记录显示出来。(6)要求使用BST或者AVL实现动态索引结构。【提高要求】(1)系统支持铃声库和图片库的数据存储,提供添加、删除、修改、播放等操作。铃声库和图片库可直接使用文件目录进行管理;铃声格式可使用WAV、MP3或者WMA格式;图片格式可使用BMP、JPG等格式。(2)电话簿记录信息支持:来电铃声、来电图片等信息,用户可通过界面编辑或者浏览某条电话簿记录的来电铃声、来电图片。(3)人名查询支持:输入姓名的首字母查找。(4)使用红黑树或者B-树的数据结构,来实现动态索引结构。【测试数据】自行随机生成5001000条电话簿数据记录。【实现提示】(1)设计合适的电话簿数据文件格式;(2)设计合适的索引文件格式。 总体分析与设计利用二叉搜索数为存储结构进
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1