数据结构课程设计报告.docx
- 文档编号:4768332
- 上传时间:2022-12-08
- 格式:DOCX
- 页数:55
- 大小:121.10KB
数据结构课程设计报告.docx
《数据结构课程设计报告.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计报告.docx(55页珍藏版)》请在冰豆网上搜索。
数据结构课程设计报告
数据结构课程设计
题目:
赫夫曼树的建立
运动会分数统计
订票系统
猴子选大王
姓 名:
**
学 号:
****
专 业:
***
指导教师:
****
一:
绪言………………………………………………............3
1.1课题设计背景…………………………………..........3
1.2课题研究的目的和意义…………………………….3.
1.3课题研究的内容……………………………………..4
二:
具体程序设计……………………………………………62.1赫夫曼树的建立……………………………………………6
2.2运动会设计………………………………………………..8
2.3订票系统………………………………………………….12
2.4猴子选大王……………………………………………….15
三:
总结与展望………………………………………………………15
四:
参考文献…………………………………………………………15
附:
程序源代码
.
1.绪言
1.1课题背景
《数据结构》作为一门独立的课程最早是美国的一些大学开设的,1968年美国唐·欧·克努特教授开创了数据结构的最初体系,他所著的《计算机程序设计技巧》第一卷《基本算法》是第一本较系统地阐述数据的逻辑结构和存储结构及其操作的著作。
从60年代末到70年代初,出现了大型程序,软件也相对独立,结构程序设计成为程序设计方法学的主要内容,人们就越来越重视数据结构,认为程序设计的实质是对确定的问题选择一种好的结构,加上设计一种好的算法。
从70年代中期到80年代初,各种版本的数据结构著作就相继出现。
目前在我国,《数据结构》也已经不仅仅是计算机专业的教案计划中的核心课程之一,而且是其它非计算机专业的主要选修课程之一。
《数据结构》在计算机科学中是一门综合性的专业基础课。
数据结构的研究不仅涉及到计算机硬件<特别是编码理论、存储装置和存取方法等)的研究范围,而且和计算机软件的研究有着更密切的关系,无论是编译程序还是操作系统,都涉及到数据元素在存储器中的分配问题。
在研究信息检索时也必须考虑如何组织数据,以便查找和存取数据元素更为方便。
因此,可以认为数据结构是介于数学、计算机硬件和计算机软件三者之间的一门核心课程,在计算机科学中,数据结构不仅是一般程序设计<特别是非数值计算的程序设计)的基础,而且是设计和实现编译程序、操作系统、数据系统及其它系统程序和大型应用程序的重要基础。
值得注意的是,数据结构的发展并未终结,一方面,面向各专门领域中特殊问题的数据结构得到研究和发展,如多维图形数据结构等;另一方面,从抽象数据类型的观点来论数据结构,已成为一种新的趋势,越来越被人们所重视。
1.2课题研究的目的和意义
通过对此次数据结构大型作业内容的实际操作及分析,加深对数据结构丰富功能的理解及增强实际动手能力,在实践中不断提高对汇编语言的运用能力。
锻炼学生分析与编写大型软件代码的能力。
通过与同组同学的合作,锻炼协作的能力。
二:
具体程序设计
2.1赫夫曼树的建立
1.任务:
建立建立最优二叉树函数
2.要求:
可以建立函数输入二叉树,并输出其赫夫曼树
3.概要设计
程序流程图如下:
4.调试分析
运行时显示:
输入abcde时:
输入110时:
这时按任意键则返回编辑窗口
2.2运动会分数统计
1.任务:
参加运动会有n个学校,学校编号为1……n。
比赛分成m个男子工程,和w个女子工程。
工程编号为男子1……m,女子m+1……m+w。
不同的工程取前五名或前三名积分;取前五名的积分分别为:
7、5、3、2、1,前三名的积分分别为:
5、3、2;哪些取前五名或前三名由学生自己设定。
2.功能要求: 1>.可以输入各个工程的前三名或前五名的成绩; 2>.能统计各学校总分, 3>.可以按学校编号、学校总分、男女团体总分排序输出;4>.可以按学校编号查询学校某个工程的情况;可以按工程编号查询取得前三或前五名的学校。 3.规定: 输入数据形式和范围: 20以内的整数<如果做得更好可以输入学校的名称,运动工程的名称) 4.抽象数据类型结构体数组的定义如下: #defineM6/*6个男子工程*/ #defineW4/*4个女子工程*/ #defineN10 typedefstruct{ intman[5+1]。 /*排名,此数组中存放学校代码*/ intwomen[3+1]。 charIname[M+W+1]。 /*工程名称*/ }Item。 /*工程代码, typedefstruct{ intscoreT。 /*学校总分*/ intscoreM。 /*男子总分*/ intscoreW。 /*女子总分*/ intman[M+1]。 /*男子工程*/ intwomen[W+1]。 /*女子工程*/ intflag。 /*排序用旗帜*/ }School。 ItemiteM[M+W+1]。 /*M+W个工程*/ Schoolsch[N+1]。 /*n个学校,0不用*/ charname[N+1][100]。 voidInput(>//输入函数 voidInitial(>//初始化函数 voidSchool_F(>//按学校代码查询函数 voidItem_F(>//运动工程查询函数 voidFind(>//查询菜单函数 voidOrder_ST(>//总分排序函数 voidOrder_SM(>//男子总分排序函数 voidOrder_SW(>//女子总分排序函数 voidFind_O(>//排序菜单函数 voidOutput(>//输出到文件函数 void 5.本程序包括5个模块 a.主程序模块: Voidmain(> {Do {接受命令; 处理命令。 }while(“命令”=退出>; } b.信息输入模块——实现信息的输入; c.信息查询模块——实现信息的查询; d.信息排序查询模块——实现各种的有序输出; e.信息存盘模块——实现输出到文件。 各模块的关系如下: 主程序模块——信息输入模块——信息查询——信息排序查询模块—信息存盘模块. 6.流程图 主函数 欢迎界面 选择功能scanf("%d",&a> If(i=1> If(i=2> If(i=3> 成绩输入 查询 排序查询 成绩输入 选择功能 For(i=1。 i<=N。 i++>工程个数 输入工程代码及名称 输入男子工程前五名 输入女子工程前三名 查询 Scanf(“%d”,&a>。 T=1 t=2 T=3 按学校代码 按工程编号 返回上一级菜单 排序查询 选择功能 Scanf(“%d”,&a>。 选canf(“%d”,&a>。 a=1 a=2 按学校总分查询 按男团总分查询 7.调试分析 a.本程序在工程上采用了数字代码操作,并且能同步输入输出工程名和学校名。 实现方法为在学校结构体内增加字符数组用来存储学校的名称。 缺点就是没有考虑有一个学生参加两项比赛的情况,这就要再次增加循环参加比赛的数目。 b.算法的时空分析 <1)本程序时间复杂度为N*N主要集中在按积分排序的过程,在排序时采用了冒泡排序,而且在交换数据时也较大地耗费内存,至今未能解决。 。 <2)另外一点在于工程查询时,会增加时间复杂度,为了减少时间复杂度,我把按工程查找分为按女子和按男子查找,这样在查询工程时可先判断是男子工程还是女子工程,再查找,这样就减少时间复杂度。 <3)在空间复杂度方面,本程序几乎没有用到辅助空间,只是未用到所有的数组,会浪费一些存储空间。 8.测试结果 这是在学校个数为1,工程数为2<包括一个男子工程一个女子工程)时的输出文件情况: 1a学校 总分: 7,男子总分: 7,女子总分: 0 2b学校 总分: 7,男子总分: 5,女子总分: 2 3c学校 总分: 6,男子总分: 3,女子总分: 8 4d学校 总分: 2,男子总分: 2,女子总分: 8 5e学校 总分: 6,男子总分: 1,女子总分: 5 6学校 总分: 0,男子总分: 0,女子总分: 8 7学校 总分: 0,男子总分: 0,女子总分: 0 8学校 总分: 0,男子总分: 0,女子总分: 0 9学校 总分: 0,男子总分: 0,女子总分: 0 10学校 总分: 0,男子总分: 0,女子总分: 0 男子工程1排名: 第1名: 1第2名: 2第3名: 3第4名: 4第5名: 5 男子工程2排名: 第1名: 0第2名: 0第3名: 0第4名: 0第5名: 0 男子工程3排名: 第1名: 0第2名: 0第3名: 0第4名: 0第5名: 0 男子工程4排名: 第1名: 0第2名: 0第3名: 0第4名: 0第5名: 0 男子工程5排名: 第1名: 0第2名: 0第3名: 0第4名: 0第5名: 0 男子工程6排名: 第1名: 0第2名: 0第3名: 0第4名: 0第5名: 0 女子工程7排名: 第1名: 0第2名: 0第3名: 0 女子工程8排名: 第1名: 5第2名: 3第3名: 2 女子工程9排名: 第1名: 0第2名: 0第3名: 0 女子工程10排名: 第1名: 0第2名: 0第3名: 0 2.3订票系统 1.任务: 通过此系统可以实现如下功能: a.录入: 可以录入航班情况<数据可以存储在一个数据文件中,数据结构、具体数据自定) b.查询: 可以查询某个航线的情况<如,输入航班号,查询起降时间,起飞抵达城市,航班票价,票价折扣,确定航班是否满仓); 可以输入起飞抵达城市,查询飞机航班情况; c.订票: <订票情况可以存在一个数据文件中,结构自己设定) 可以订票,如果该航班已经无票,可以提供相关可选择航班; d.退票: 可退票,退票后修改相关数据文件; 客户资料有姓名,证件号,订票数量及航班情况,订单要有编号。 修改航班信息: 当航班信息改变可以修改航班数据文件 2.要求: 根据以上功能说明,设计航班信息,订票信息的存储结构,设计程序完成功能; 3.具体概要设计 a.抽象类型定义如下 structFlaight{ charflaNum[10]。 /*航班号*/ charfTime[10]。 /*起飞时间*/ charlTime[10]。 /*降落时间? */ charfCity[30]。 /*起飞城市*/ charlCity[30]。 /*降落城市*/ intfprice。 /*票价*/ charpriOf[10]。 /*折扣*/ intseat。 /*座位数*/ structFlaight*next。 }。 structCustom/*客户资料*/ {charCname[30]。 /*客户姓名*/ charID[30]。 /*证件号*/ intTicketN。 /*订票数量*/ charFlaN[10]。 /*航班号*/ charListN[60]。 /*订单编号*/ structCustom*next。 }。 structFlaight*head1=NULL。 structCustom*head2=NULL。 b.本程序包含三个模块 <1)主程序模块: Voidmain(> { do{ 接受命令; 处理命令; }while(命令! =退出>; } <2)信息输入模块——完成基本信息的输入 <3)实现功能模块——实现各种功能操作 <4)读写文件模块——实现文件建立和读写 4.流程图 主函数模块 Menu菜单 Case1 Case2 Case3 Case4 Case5 Case6 订票 查询 修改 存盘 文件读入 显示信息 查询航班信息 printf("xxxx航班-->: ">。 输入航班号; for(p1=head1->next。 p1->next! =NULL。 p1=p1->next> if(p1! =NULL> 输出所查询航班的信息 航班信息修改模块 while(> {p1=p1->next。 } print("请选择功能: ">。 输入功能号 Cas1 Cas2 Cas3 Case4 Case5 Case6 Case7 Case8 起飞时间 抵达时间 起飞地 目的地 票价 折扣 总座位数 跳出 5.调试分析 原始信息: 航班: ca112: 5013: 10长沙广州1340.310ca215: 4501: 50南京香港2140.43 ca319: 2104: 31长沙广州4310.85ca401: 3007: 04重庆长春3100.76 ca502: 0810: 56上海汉城1260.410ca620: 1822: 47东京纽约9870.976 ca1014: 0123: 59重庆长春8750.812ca1105: 0922: 12南京香港4220.343 ca1212: 0416: 54东京纽约9860.632 客户: rayxy32ca1rayxy3samgh43ca3samgh4Andybo51ca4Andybo5 姚明Rockets10ca10姚明RocketsKobeLakers6ca5KobeLakers 曼联英格兰10ca12曼联英格兰 运行后: 航班: ca1125013: 10长沙广州1340.36ca215: 4501: 50南京香港2140.43 ca319: 2104: 31长沙广州4310.85ca134e01: 3007: 04重庆长春3100.76 ca502: 0810: 56上海汉城1260.410ca620: 1822: 47东京纽约3450.976 ca1014: 0123: 59重庆长春8750.80ca1105: 0922: 12南京香港4220.343 ca1212: 0416: 54东京纽约9860.632 客户: rayxy32ca1rayxy3samgh43ca3samgh4Andybo51ca4Andybo5姚明Rockets10ca10姚明RocketsKobeLakers6ca5KobeLakers曼联英格兰10ca12曼联英格兰 2.4猴子选大王 1.任务: 一堆猴子都有编号,编号是1,2,3...m,这群猴子 2.要求: 输入数据: 输入m,n为整数,n 输出形式: 中文提示按照m个猴子,数n个数的方法,输出为大王的猴子是几号,建立一个函数来实现此功能 3.概要设计: 基本思路是以链表顺序储存猴子的信息,利用计数器完成操作,最后打印出是第几个猴子 存储结构: 循环链表 定义: 表中最后一个结点的指针指向第一个结点 4.调试分析 运行时显示: 输入10时: 这时再输入5: 这时按任意键则返回编辑窗口 3.总结与展望 通过为期半个月的课程设计,我们对《数据结构》这门课程有了更深一步的了解。 它是计算机程序设计的重要理论技术基础,在我们计算机专业的学习中占据着十分重要的地位。 同时也使我们知道,要学好这门课程,仅学习书本上的知识是不够的,还要有较强的实践能力。 因为我们学习知识就是为了实践。 而只有多实践,多编写程序,才能更好的理解与掌握书本上的东西。 这次课程设计也让我们明白拉“团结就是力量”的魅力。 大家一起合作,一起讨论、一起研究,充分发挥团队精神,各尽其责,按时,按进度完成各自的任务,是我们能够把这个程序按时做出来的关键! 在我们组员的通力合作下,我们按照制定的计划,终于顺利地完成了这个程序。 这使得我们相信: 无论是在以后的学习还是生活中,只要我们充分发挥团队合作的精神,一定可以克服种种困难,争取更大的成功! 本次设计我们也首次使用拉WIN-TC进行编译,摆脱拉TC环境下编译的弊端,WIN-TC的编译使我们的本次课程设计更加美观。 但是也有不如意的地方,做的不好的地方,望老师谅解,我们会在以后的学习、设计中努力改进,做得更加完美。 4.参考文选 [1]严蔚敏,吴伟民编著,数据结构 [2]严蔚敏,陈文博编著,数据结构及应用算法教程,北京;清华大学出版社,2006 [3]李云清,杨庆红,揭安全编著,数据结构 [4]谭浩强编著,C语言程序设计<第二版),北京;清华大学出版社,2003 [5]各大网站 附: 程序源代码 . 1.赫夫曼树的建立 #include #include #defineMAXLEN100 typedefstructHuffmantree{ charch。 /*键值*/ intweight,mark。 /*weight为权值,mark为标志域*/ structHuffmantree*parent,*lchild,*rchild,*next。 }Hftree,*linktree。 /*整理输入的字符串,合并相同的项,并求出每个字符在数组中出现的次数*/ linktreetidycharacter(charcharacter[]> { inti=0。 linktreetree,ptr,beforeptr,node。 /*链式,tree为头结点,beforeptr为ptr的前一结点,node为新申请 的结点*/ tree=(linktree>malloc(sizeof(Hftree>>。 /*创建单链表的头结点*/ if(! tree>returnNULL。 tree->next=NULL。 /*头结点为空,且后续结点为空*/ for(i=0。 character[i]! ='\0'&&character[i]! ='\n'。 i++>{/*遍历直到字符串结束为止*/ ptr=tree。 beforeptr=tree。 node=(linktree>malloc(sizeof(Hftree>>。 /*新申请结点node*/ if(! node>returnNULL。 node->next=NULL。 node->parent=NULL。 node->lchild=NULL。 node->rchild=NULL。 /*置空*/ node->mark=0。 node->ch=character[i]。 node->weight=1。 if(tree->next==NULL> tree->next=node。 /*头结点的下一结点为空,连接node*/ else{ ptr=tree->next。 while(ptr&&ptr->ch! =node->ch>{/*将指针移至链表尾*/ ptr=ptr->next。 beforeptr=beforeptr->next。 /*后移*/ } if(ptr&&ptr->ch==node->ch>{/*如果链表中某结点的字符与新结点的字符相同*/ /*将该结点的权加一*/ ptr->weight=ptr->weight+1。 free(node>。 /*释放node结点的存储空间*/ } else{/*新结点与表中结点不相同,将新结点插入链表后*/ node->next=beforeptr->next。 beforeptr->next=node。 /*node连接在beforeptr之后*/ } } } returntree。 } /*将整理完的字符串按出现次数从小到大的顺序排列*/ linktreetaxisnode(linktreetree> { linktreehead,ph,pt,beforeph。 /*head为新链表的表头结点*/ head=(linktree>malloc(sizeof(Hftree>>。 /*创建新链表的头结点*/ if(! head>returnNULL。 head->next=NULL。 /*新结点的头结点为空,后续结点也为空*/ ph=head。 beforeph=head。 while(tree->next>{ pt=tree->next。 /*取被操作链表的首元结点*/ tree->next=pt->next。 pt->next=NULL。 /*取出pt所指向的结点*/ ph=head->next。 beforeph=head。 if(head->next==NULL> head->next=pt。 /*创建当前操作链表首元结点*/ else{ while(ph&&ph->weight ph=ph->next。 beforeph=beforeph->next。 } pt->next=beforeph->next。 beforeph->next=pt。 } } free(tree>。 returnhead。 } /*用排完序的字符串建立霍夫曼树*/ linktreecreateHftree(linktreetree> { linktreep,q,newnode,beforep。 for(p=tree->next,q=p->next。 p! =NULL&&q! =NULL。 p=tree->next,q=p->next>{ tree->next=q->next。 q->next=NULL。 p->next=NULL。 newnode=(linktree>malloc(sizeof(Hftree>>。 /*申请新结点作为霍夫曼树的中间结点*/ if(! newnode>returnNULL。 newnode->next=NULL。 newnode->mark=0。 newnode->lchild=p。 /*取链表头结点后的两个结点作为新结点的左、右儿子*/ newnode->rchild=q。 p->parent=newnode。 q->parent=ne
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)