学生搭配问题数据结构课程设计说明书
- 格式:pdf
- 大小:1.09 MB
- 文档页数:11
《数据结构》课程设计计划书班级:2012信计专业授课教师:马阿曼一、课程设计目的《数据结构》课程是计算机科学与技术专业的核心专业基础课。
本课程设计的目的是将数据结构理论和实践结合起来,锻练学生编写程序过程中的数据结构使用和分析、解决实际问题的能力。
1、使学生进一步理解和掌握课堂上所学各种基本抽象数据类型的逻辑结构、存储结构和操作实现算法,以及它们在程序中的使用方法。
2、使学生掌握软件设计的基本内容和设计方法,并培养学生进行规范化软件设计的能力。
3、使学生掌握使用各种计算机资料和有关参考资料,提高学生进行程序设计的基本能力。
二、课程设计内容《数据结构》课程设计包含以下主要内容:1、查阅相关资料确定课题;2、课题所设计的数据结构设计、算法设计;3、编写代码并调试;4、完成课程设计报告;5、进行课设答辩。
三、设计地点及时间安排地点:瑞樟6-402时间:2014年6月3、4、5、6、7、8号四、课程设计报告的书写格式1、问题描述:描述要求编程解决的问题。
2、基本要求:给出程序要达到的具体的要求。
3、测试数据:设计测试数据,或具体给出测试数据。
要求测试数据能全面地测试所设计程序的功能。
4、算法思想:描述解决相应问题算法的设计思想。
5、模块划分:描述所设计程序的各个模块(即函数)功能。
6、数据结构:给出所使用的基本抽象数据类型,所定义的具体问题的数据类型,以及新定义的抽象数据类型。
7、算法设计分析:给出算法的设计分析和算法流程图。
8、源程序:给出所有源程序清单,要求程序有充分的注释语句,至少要注释每个函数参数的含义和函数返回值的含义。
9、测试情况:给出程序的测试情况,并分析运行结果。
10、收获及体会:写出此次课程设计过程中的收获及体会。
五、评分标准1、程序运行结果(30%)2、设计报告(30%)3、设计考勤,平时上机成绩,教师不定期检查(10%)4、学生根据自己设计报告对教师的提问可以熟练的解释(10%)5、设计课题的难易程度(20%)六、参考设计题目课程设计题一:学生成绩管理系统设计目的:1、掌握线性链表的建立。
《数据结构》课程设计指导书一、课程教学目标用所学的数据结构有关理论知识,结合实际问题设计相关算法及程序达到理论与实践相结合的目的(该课程设计为必修课,2学分)。
二、设计目的1、掌握如何利用合适的数据结构和相应的算法来解决实际问题的方法,巩固和掌握《数据结构》这门课的理论知识和实践技能。
2、进一步加强学生的程序设计能力的培养,增强分析问题、解决问题的能力,掌握软件设计思想。
三、教学基本内容及学时安排1、设计内容(1)一元多项式的表示及其运算(要求:包括相加、相减、相乘等运算);(2)集合的表示与运算;(3)航空客运订票系统;(4)马踏棋盘问题(要求,设计算法为非递归算法);(5)算术表达式求值问题;(6)迷宫问题(要求:设计算法为非递归算法);(7)哈夫曼编/译码器;(8)校园导游咨询;(9)图的遍历、最小生成树、拓扑排序、关键路径、最短路径等内容;(10)学生成绩管理系统等;(要求:结合查找、排序思想)说明:从以上内容中任选一个或多个设计内容进行设计,或自选设计题目,但难度应适中,须经指导教师同意。
2、设计要求:在TC或VC环境下进行设计。
四、重要教学环节1、步骤选题----安案设计----详细设计----上机调试----分析结果----写出设计报告2、指导答疑与相关指导教师进行协商。
五、设计进程及要求1、第一周周一进行选题2、第一周周二至周三进行需求分析与概要设计2、第一周周四至第二周周三详细设计并上机调试3、第二周周四写出课程设计说明书并上交4、第二周周五答辩要求:在上机期间不准无故缺勤,有事须向指导教师请假。
六、设计说明书的撰写内容和要求1、说明书的撰写内容:设计题目、设计问题描述、设计方案与概要设计、详细设计、系统运行说明、测试结果、总结分析(包括此系统的优缺点及可进一步完善的功能)、附录(源程序文件清单)。
(格式见附录三)2、要求:图表规范、语言准确、流畅、内容充实,字数5000字左右(包括图表、附录不算)。
应用技术学院课程设计报告课程名称《数据结构课程设计》设计题目猴子选大王;建立二叉树;各种排序;有序表的合并;成绩管理系统;院系计算机科学与信息工程专业计算机科学与技术班级学号指导教师日期一.目的与要求1. 巩固和加深对常见数据结构的理解和掌握2. 掌握基于数据结构进行算法设计的基本方法3. 掌握用高级语言实现算法的基本技能4. 掌握书写程序设计说明文档的能力5. 提高运用数据结构知识及高级语言解决非数值实际问题的能力二.课程设计容说明1. 项目一(1) 对设计任务容的概述学生成绩管理**任务:要现对学生资料的录入、浏览、插入和删除等功能。
输入:设学生成绩以记录形式存储,每个学生记录包含的信息有:学号和各门课程的成绩,设学生成绩至少3门以上。
存储结构:采用线性链式结构。
(2) 详细设计LinkList *create():输入学生成绩记录函数;void print(LinkList *head):显示全部记录函数LinkList *Delete(LinkList *head):删除记录函数LinkList *Insert(LinkList *head):插入记录函数void menu_select():菜单选择void ScoreManage():函数界面(3) 程序流程图(4) 程序模块及其接口描述该程序可以分为以下几个模块:1、菜单选择:void menu_select();提供五种可以选择的操作,在main函数过switch语句调用菜单menu_select()函数,进入不同的功能函数中完成相关操作。
2、输入功能:LinkList *create();通过一个for循环语句的控制,可以一次完成无数条记录的输入。
并将其存入链表。
3、输出功能:void print(LinkList *head);通过一个while的循环控制语句,在指针p!=NULL时,完成全部学生记录的显示。
知道不满足循环语句,程序再次回到菜单选择功能界面。
数据结构课程安排之阳早格格创做题目: 教死拆配问题教院:班级:教死姓名:教死教号:指导教师:2012 年 12 月 3 日戴要针对于教死拆配问题,循环行列是一种要害的链式结构,其特殊性正在于需附设二个指针front战rear分别指示对于头元素及队尾元素的位子且对于头战队尾相邻交.正在步调的安排历程中,使用了百般基原的算法,有推断队空及队谦,出队,进队等.循环行列是正在行列的程序保存结构中,除了用乙组天面连绝的保存单元依次存搁从行列头到行列尾的元素中,尚需附设二个指针front 战rear分别指示行列头元素战行列尾元素的位子.教死拆配问题是典型的惟有采与循环行列才搞办理的问题,真验标明该算法的空间搀纯度劣于其余算法.原文用循环行列会很佳的把那个步调安排出去,会有很佳的效验.得出的步调运止截止不妨很局里的把截止表示出去.闭键词汇:教死配对于,数据结构,循环行列.目录纲要错误!未定义书签。
1安排题目错误!未定义书签。
2运止环境13算法安排的思维14 算法的过程图25 算法安排分解26 源代码37 运止截止分解88 支获及体验8参照文件9致开9教死拆配问题一班有m个女死,有n个男死(m出有等于n),现要启一个舞会. 男女死分别编号坐正在舞池的二边的椅子上.每直启初时,依次从男死战女死中各出一人配对于跳舞, 原直出乐成配对于者坐着等待下一直找舞陪.请安排一系统模拟动向天隐现出上述历程,央供如下:(1)输出每直配对于情况(2)估计出所有一个男死(编号为X)战任性女死(编号为Y),正在第K直配对于跳舞的情况.起码供出K的二个值.原课题的步调安排战尝试等关节皆是正在Windows7支配系统下完毕,硬件的编译尝试环境为vc6.0 以c谈话编写的.硬件的硬件运止需要非常矮,所有估计机皆可运止.基原思路:行列(Queue)是只允许正在一端举止拔出,而正在另一端举止简略的运算受限的线性表.循环行列是正在行列的程序保存结构中,除了用乙组天面连绝的保存单元依次存搁从行列头到行列尾的元素中,尚需附设二个指针front战rear分别指示行列头元素战行列尾元素的位子.循环行列(二个),将男死、女死二组人分别存搁,以真止循环配对于输出.循环行列的进队,出队,判队谦,判队空.(1)要模拟动向天隐现出现题目中所央供的循环,咱们要先修坐二个循环行列SqQueue战SqQueue2.(2)将男死、女死二组人分别存进那二个行列.以真止他们的循环配对于输出,那是循环行列固有的个性.(3)利用循环行列的个性,将男女死分别举止进行列战出行列支配,且真止拆配输出.(4)循环行列的少度分别设为男女死的个数即可.(5)正在估计机末端输出的截止是:根据央供输出男死女死拆配情况闭键问题: 循环行列的应用办理要领:数据模型(逻辑结构): 循环行列(二个),将男死、女死二组人分别存搁,以真止循环配对于输出.保存结构: 循环链表核心算法: 循环行列的进队,出队,判队谦,判队空.输进数据: 男死人数、女死人数,歌直数量输出数据: 每一尾歌直播搁时,男死战女死拆配情况(只输出编号即可)当要查找的男女拆配时输出歌直编号,战他们拆配的总次数.通过以上分解,该步调具备可止性.调试历程中出现的问题及办理要领:“空”仍旧“谦”,果此,正在进队支配即拔出一个新元素动做新的队尾元素时出现了问题,即末尾一位共教无法进队.办理要领:将行列调配的最大空间起码再减少一个6.源代码#include <string.h>#include<stdio.h>#include <time.h>#include <malloc.h>#define MAXSIZE 60#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define OVERFLOW -1//typedef int system; typedef struct QNode{int num;struct QNode *next;}QNode,* QueuePtr;typedef struct{QueuePtr front;QueuePtr rear;}LinkQueue;void sleep( clock_t wait ) {clock_t goal;goal = wait + clock(); while( goal > clock() ) ; }void InitQ(LinkQueue &Q) {QueuePtr p;p=(QueuePtr)malloc(sizeof(QNode)); Q.front=p;Q.rear=p;Q.front->next=NULL;}void EnQueue(LinkQueue &Q,int num) {QueuePtr p;p=(QueuePtr)malloc(sizeof(QNode)); p->num=num;p->next=NULL;Q.rear->next=p;Q.rear=p;}void DeQueue(LinkQueue &Q, int &num) {QueuePtr p,q;if(Q.front==Q.rear)printf("行列为空");p=Q.front->next;num=p->num;Q.front->next=p->next;q=p->next;if(Q.rear==q)Q.rear=Q.front;free(p);}void printF(LinkQueue &F,int i) {QueuePtr p;int n=1;while(n<i){printf("_ ");n++;}p=F.front->next;while(F.rear!=p){printf("%d ",p->num);p=p->next;}printf("%d \n",p->num);}void printM(LinkQueue &M,int i) {QueuePtr p;int n=1;while(n<i){printf("_ ");n++;}p=M.front->next;while(M.rear!=p){printf("%d ",p->num);p=p->next;}printf("%d \n",p->num);}int main(){int m,n,k,i,a,b;int count=0,num;QueuePtr p,q;LinkQueue F;LinkQueue M;printf("请输进女死数量:");scanf("%d",&m);printf("请输进男死数量:");scanf("%d",&n);printf("请输直子号:");scanf("%d",&k);printf("请输进要查找的男死编号:"); scanf("%d",&a);printf("请输进要查找的女死编号:"); scanf("%d",&b);InitQ(F);InitQ(M);for(i=1;i<=m;i++){EnQueue(F,i);}for(i=1;i<=n;i++){EnQueue(M,i);}for(i=1;i<=k;i++){system("CLS");printf("第%d尾直子 \n",i);printF(F,i);printM(M,i);p=F.front->next;q=M.front->next;printf("暂时跳舞的是第%d号女死战第%d号男死\n",p->num,q->num); if(p->num==a&&q->num==b){count++;printf("第%d直是要查找的男女死跳舞\n",i);}sleep(3000);DeQueue(F,num);EnQueue(F,num);DeQueue(M,num);EnQueue(M,num);}printf("该对于男女死共跳舞%d次\n",count);system("PAUSE");return 0;}尝试及运止截止尝试输进数据:男女死的个数直子数战要查找的男女死编号输出截止为:每尾直子男女死拆配的情况步调运止界里:通过一周的教习战试验,办理本质问题(教死拆配问题),让尔对于循环行列有了更深的相识,对于数据结构爆收了浓薄的兴趣,共时也让尔普及了办理本质问题的本领.咱们要出有竭的通过上机去普及自己的教习火仄,正在上机的共时改正了自己对于某些算法的过失使用,使自己正在通历步调办理问题时抓住闭键算法,有了算法安排思维战过程图,并用C谈话描画出闭键算法.参照文件[1] 数据结构(C谈话版)宽蔚敏吴伟明编著,浑华大教出版社[2] C谈话步调安排(第三版)谭浩强著,浑华大教出版社致开最先,尔要感动书籍院给咱们提供了此次课程安排的机会,能让共教们正在所有教习与钻研,让咱们有机会对于所教的表里知识举止试验.其次,尔还要特天感动尔的领导教授弛太收教授,正在他的粗心领导战助闲下,尔的安排才得以乐成完毕,并使所教知识得以真真的应用.对于他为尔的安排所提出的贵沉意睹表示忠心的感动!末尾,正在安排历程中,也得到了许多共教的贵沉修议,共时还到许多校友的支援战助闲,正在此一并致以诚挚的开意.课程安排评阅书籍。
数据结构课程设计题目: 学生搭配问题学院:班级:学生姓名:学生学号:指导教师:2012 年 12 月 3 日课程设计任务书摘要针对学生搭配问题,循环队列是一种重要的链式结构,其特殊性在于需附设两个指针front和rear分别指示对头元素及队尾元素的位置且对头和队尾相邻接。
在程序的设计过程中,运用了各种基本的算法,有判断队空及队满,出队,入队等.循环队列是在队列的顺序存储结构中,除了用乙组地址连续的存储单元依次存放从队列头到队列尾的元素外,尚需附设两个指针front和rear分别指示队列头元素和队列尾元素的位置。
学生搭配问题是典型的只有采用循环队列才能解决的问题,实验表明该算法的空间复杂度优于其他算法。
本文用循环队列会很好的把这个程序设计出来,会有很好的效果。
得出的程序运行结果能够很形象的把结果表示出来。
关键词:学生配对,数据结构,循环队列。
目录摘要................................... 错误!未定义书签。
1 设计题目............................. 错误!未定义书签。
2 运行环境 (1)3 算法设计的思想 (1)4 算法的流程图 (2)5 算法设计分析 (2)6 源代码 (3)7 运行结果分析 (8)8 收获及体会 (8)参考文献 (9)致谢 (9)学生搭配问题1.设计题目一班有m个女生,有n个男生(m不等于n),现要开一个舞会. 男女生分别编号坐在舞池的两边的椅子上.每曲开始时,依次从男生和女生中各出一人配对跳舞, 本曲没成功配对者坐着等待下一曲找舞伴。
请设计一系统模拟动态地显示出上述过程,要求如下:(1)输出每曲配对情况(2)计算出任何一个男生(编号为X)和任意女生(编号为Y),在第K曲配对跳舞的情况.至少求出K的两个值。
2.运行环境本课题的程序设计和测试等环节都是在Windows7操作系统下完成,软件的编译测试环境为vc6.0 以c语言编写的。
数据结构课程设计》指导书一、实习目的数据结构课程设计是一项综合性设计活动,要求在教师的指导下,利用本课程内的以及到目前为止所学到的有关知识和技术解决一些不太复杂但却是综合性的问题。
从规模来说,课程设计是在平时作业的基础上进一步扩大的大作业。
在设计中,要求学生要全面考虑相互联系的各个方面及问题。
通过课程设计,使学生对整个课程的知识体系有较深入的理解,在运用本课程的知识解决实际问题方面得到锻炼,对锻炼学生的实践能力以及运用本课程的知识、方法解决更为复杂的实际问题有较好的启发和指导作用,从而为后续课程的学习、毕业设计环节以及将来的实际工作打好坚实的基础。
通过对给定问题的求解,使学生在运用《数据结构》、程序设计以及迄今为止所学课程中的各种基本技术和理论,在建立问题模型、构造求解算法、设计数据结构、编程及上机调试等方面得到全面的锻炼,从而能更深刻地理解《数据结构》的精髓,为后续软件课程的学习及软件设计能力的提高奠定良好的基础。
二、数据结构课程设计要求1.学生必须仔细阅读《数据结构》课程设计方案,认真主动完成课设的要求。
有问题及时主动通过各种方式与教师联系沟通。
2.学生要发挥自主学习的能力,充分利用时间,安排好课设的时间计划,并在课设过程中不断检测自己的计划完成情况,及时向教师汇报。
3.课程设计按照教案要求需要两周时间完成(2 周共十天)。
三、实习基本内容本次课程设计完成如下模块(共 23个模块,学生可以在其中至少挑选 5-6个功能块完成,其中 8、9、 10、13在做5个以下不算数但已经做了 5个以上算数)1 【校园导游程序】问题描述:用无向网表示你所在学校的校园景点平面图,图中顶点表示主要景点,存放景点的编号、名称、简介等信息,图中的边表示景点间的道路,存放路径长度等信息。
要求能够回答有关景点介绍、游览路径等问题。
基本要求:查询各景点的相关信息;查询图中任意两个景点间的最短路径;查询图中任意两个景点间的所有路径;增加、删除、更新有关景点和道路的信息。
《数据结构》课程设计任务书一、课程设计教学目的及基本要求1. 了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力;2. 初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;3. 提高综合运用所学的理论知识和方法独立分析和解决问题的能力;4. 训练用系统的观点和软件开发一般规范进行软件开发,培养软件工作者所应具备的科学的工作方法和作风;5. 独立完成或分组完成;6. 题材不限,或从参考题目中任选一题;7. 仅限用C语言编写程序;8. 7月3日前完成。
9./jsjxy/jpkc/中课程资源有五份课程设计样例,格式可以参照,不能抄袭!10.允许分小组完成,每组最多3人组成,每人分别都要提交自己的课程设计报告,并填写附录文件“09软工数据结构课程设计分组情况.xls”。
11.同一个题目不能超过6个小组选作,“整个专业分组表”请2个班班长一起汇总,6月15日前发我信箱huangsix@。
12.每个同学设计报告命名“学号姓名.doc”,7月3日前“按班级”打一个压缩包发我信箱。
二、课程设计步骤1. 问题分析和任务定义:根据设计题目的要求,充分地分析和理解问题,明确问题要求做什么?(而不是怎么做?)限制条件是什么?2. 逻辑设计:对问题描述中涉及的操作对象定义相应的数据类型,并按照以数据结构为中心的原则划分模块,定义主程序模块和各抽象数据类型。
逻辑设计的结果应写出每个抽象数据类型的定义(包括数据结构的描述和每个基本操作的功能说明),各个主要模块的算法,并画出模块之间的调用关系图;3. 详细设计:定义相应的存储结构并写出各函数的伪码算法。
在这个过程中,要综合考虑系统功能,使得系统结构清晰、合理、简单和易于调试,抽象数据类型的实现尽可能做到数据封装,基本操作的规格说明尽可能明确具体。
详细设计的结果是对数据结构和基本操作作出进一步的求精,写出数据存储结构的类型定义,写出函数形式的算法框架;4. 程序编码:把详细设计的结果进一步求精为程序设计语言程序。
《数据结构课程设计》指导书一、实习目的数据结构课程设计是一项综合性设计活动,要求在教师的指导下,利用本课程内的以及到目前为止所学到的有关知识和技术解决一些不太复杂但却是综合性的问题。
从规模来说,课程设计是在平时作业的基础上进一步扩大的大作业。
在设计中,要求学生要全面考虑相互联系的各个方面及问题。
通过课程设计,使学生对整个课程的知识体系有较深入的理解,在运用本课程的知识解决实际问题方面得到锻炼,对锻炼学生的实践能力以及运用本课程的知识、方法解决更为复杂的实际问题有较好的启发和指导作用,从而为后续课程的学习、毕业设计环节以及将来的实际工作打好坚实的基础。
通过对给定问题的求解,使学生在运用《数据结构》、程序设计以及迄今为止所学课程中的各种基本技术和理论,在建立问题模型、构造求解算法、设计数据结构、编程及上机调试等方面得到全面的锻炼,从而能更深刻地理解《数据结构》的精髓,为后续软件课程的学习及软件设计能力的提高奠定良好的基础。
二、数据结构课程设计要求1.学生必须仔细阅读《数据结构》课程设计方案,认真主动完成课设的要求。
有问题及时主动通过各种方式与教师联系沟通。
2.学生要发挥自主学习的能力,充分利用时间,安排好课设的时间计划,并在课设过程中不断检测自己的计划完成情况,及时向教师汇报。
3.课程设计按照教案要求需要两周时间完成(2周共十天)。
三、实习基本内容本次课程设计完成如下模块(共23个模块,学生可以在其中至少挑选5-6个功能块完成,其中8、9、10、13在做5个以下不算数但已经做了5个以上算数)1 【校园导游程序】问题描述:用无向网表示你所在学校的校园景点平面图,图中顶点表示主要景点,存放景点的编号、名称、简介等信息,图中的边表示景点间的道路,存放路径长度等信息。
要求能够回答有关景点介绍、游览路径等问题。
基本要求:查询各景点的相关信息;查询图中任意两个景点间的最短路径;查询图中任意两个景点间的所有路径;增加、删除、更新有关景点和道路的信息。
课程设计报告1:需求分析:核心问题: 循环队列的应用数据模型(逻辑结构): 循环队列(两个),将男生、女生两组人分别存放,以实现循环配对输出。
存储结构: 循环链表核心算法: 循环队列的入队,出队,判队满,判队空。
输入数据: 男生人数、女生人数,歌曲数量,几号男生和几号女生在第几首歌曲的情况。
输出数据: 每一首歌曲播放时,男生和女生搭配情况(只输出编号即可)当要查找的男女搭配时输出歌曲编号,和他们搭配的总次数。
通过以上分析,该程序具有可行性。
2:概要设计:队列(Queue)是只允许在一端进行插入,而在另一端进行删除的运算受限的线性表。
循环队列是在队列的顺序存储结构中,除了用乙组地址连续的存储单元依次存放从队列头到队列尾的元素外,尚需附设两个指针front和rear分别指示队列头元素和队列尾元素的位置。
循环队列(两个),将男生、女生两组人分别存放,以实现循环配对输出。
循环队列入队,出队,判队满,判队空。
(1)要模拟动态地显示出现题目中所要求的循环,我们要先建立两个循环队列SqQueue和SqQueue2。
(2)将男生、女生两组人分别存入这两个队列。
以实现他们的循环配对输出,这是循环队列固有的特性。
(3)利用循环队列的特性,将男女生分别进行入队列和出队列操作,且实现搭配输出。
(4)循环队列的长度分别设为男女生的个数即可。
(5)在计算机终端输出的结果是:根据要求输出男生女生搭配情况。
3详细设计:建立两个链式循环队列来分别存储男生和女生,然后调用入队出队函数实现循环队列的配对输出。
为充分利用向量空间,克服上述假上溢现象的方法是将向量空间想象为一个首尾相接的圆环,存储在其中成为循环队列。
在循环队列中进行出队、入队操作时,头尾指针仍要加1,朝前移动。
只不过当头尾指针指向向量上界时、其加1操作是指向向量的下界。
这样就可以通过出队再入队来实现男生女生的循环搭配。
课程设计过程中的关键算法如下:(1)关键算法之一:初始化队列void InitQ(LinkQueue &Q){QueuePtr p;p=(QueuePtr)malloc(sizeof(QNode));Q.front=p;Q.rear=p;Q.front->next=NULL;}(2)关键算法之二:入队函数void EnQueue(LinkQueue &Q,int num)//入队函数{QueuePtr p;p=(QueuePtr)malloc(sizeof(QNode));p->num=num;p->next=NULL;Q.rear->next=p;Q.rear=p;}(3)关键算法之三:出队函数void DeQueue(LinkQueue &Q, int &num)//出队函数{QueuePtr p,q;if(Q.front==Q.rear)printf("队列为空");p=Q.front->next;num=p->num;Q.front->next=p->next;q=p->next;if(Q.rear==q)Q.rear=Q.front;free(p);}(4)关键算法之四:输出第i首曲子时女队的情况void printF(LinkQueue &F,int i) //输出第i首曲子时女队的情况{QueuePtr p;int n=1;while(n<i){printf("_ ");n++;}p=F.front->next;while(F.rear!=p){printf("%d ",p->num);p=p->next;}printf("%d \n",p->num);}4:调试分析:依靠循环队列的特性,通过输入男女生的编号以及需要跳舞的曲数,来看此对男女生的跳舞情况。
数据结构课程设计报告书班级学号专业姓名课题描述:一、需求分析:1.设计内容一班有m个女生,有n个男生(m不等于n),现要开一个舞会. 男女生分别编号坐在舞池的两边的椅子上.每曲开始时,依次从男生和女生中各出一人配对跳舞, 本曲没成功配对者坐着等待下一曲找舞伴.请设计一系统模拟动态地显示出上述过程,要求如下:1) 输出每曲配对情况2) 计算出任何一个男生(编号为X)和任意女生(编号为Y),在第K曲配对跳舞的情况.至少求出K的两个值.3) 尽量设计出多种算法及程序,可视情况适当加分2.需求本课题要对数目不等的男生女生跳舞进行搭配,设计需要解决每一首曲子男生女生的搭配情况,要采用循环队列的模式来解决,男生和女生各在两个循环的队列中,每首曲子开始,便在两个队首各取一人成功配对跳舞,并进入队尾,等待下一次配对。
例如:(3男5女情况)第一首:男1和女1第二首:男2和女2.........第四首:男1和女4二、总体结构设计:为实现上述功能和目的,要用到循环队列的相关知识,同时,要定义一定的抽的数据类型,主函数调用各个函数模块1.各模块函数介绍:1)class cirularQueue作用:定义一个一个循环队列2)~cirularQueue()作用:定义析构函数,使对象在撤销时释放3)bool IsFull()作用:判断队列是否已满4)bool IsEmpty()作用:判断队列是否为空,用于出队列前使用5)void push(T info)作用:入队。
每对舞伴跳完舞之后,做入队处理,到达队尾,等待下次跳舞。
6)void Pop(T &info)作用:出队。
每取曲子响起时男生队列和女生队列作出队处理,两人跳舞。
7)void GetHead(T &info)作用:取队首元素,对出队的男女进行识别。
8)void Initqueue(cirularQueue<int>&,int);作用:初始化队列9)void display(int,int);作用:根据男生和女生的人数和曲目的数目,来判断每曲歌的男女配对情况10)void charge(int,int);作用:判断指定组合能否配对成功2.本程序包含三个模块:1)主程序模块:void main(){初始化;do{接受命令;处理命令;}while(“命令”=”退出”)}2)、集合单元模块——实现集合的各个函数模块3)、结点结构单元模块——定义集合的结点结构三、各子模块设计:1主函数调用关系图图main()2初始化示意图void Initqueue(cirularQueue<int> &Q,int m)3每曲配对函数调用关系图void display(int,int)图void display(int,int) 4第k曲配对函数调用图void charge(int,int)图void charge(int,int)4队满判断bool IsFull()5对空判断原则bool IsEmpty()6入队流程void push(T info)7出队流程void Pop(T &info)8.取队首元素代码void GetHead(T &info)四、编程实现:#include<iostream>template <class T>class cirularQueue //定义一个一个循环队列{ private:int MaxSize;int front; //头指针int rear; //尾指针T *data;public:cirularQueue(int MaxLength){ MaxSize=MaxLength;front=rear=0;data=new T[MaxLength];}~cirularQueue() //定义析构函数,使对象在撤销时释放{ front=rear=0;delete []data;}void Initqueue() //队列的申明{ for(int i=0;i<maxSize-1;i++)push(i);}bool IsFull() //判断队列是否已满{ if((rear+1)%MaxSize==front)return true;else return false;}bool IsEmpty() //判断队列是否为空{ if(front==rear)return true;else return false;}void push(T info) //入队{ if(IsFull()){ cout<<"错误!队列已满!"<<endl;exit(-1);}else{ data[rear]=info;rear=(rear+1)%MaxSize;}}void Pop(T &info) //出队{ if(IsEmpty()){ cout<<"错误!队列为空!"<<endl;exit(-1);}else{ info=data[front];front=(front+1)%MaxSize;}}void GetHead(T &info) //取队首元素{ if(IsEmpty()){ cout<<"错误!队列为空!"<<endl;exit (-1);}else{ info=data[front];}}};void Initqueue(cirularQueue<int>&,int);void display(int,int);void charge(int,int);using namespace std;static int songnum=0; //定义歌曲的数量并初始化为0static int m=0,n=0; //男生和女生的人数int main() //主函数{ cout<<"请分别输入男生和女生的人数:";cin>>m>>n;display(m,n);int a=0,b=0; //男生和女生的编号,以判断他们在第几首歌时能在一起跳舞char quit='y'; //判断是否继续输入,如果继续输入,则输入'y';否则输入'n'while(quit!='n'){ cout<<"请输入男生和女生的编号:";cin>>a>>b;while((a>m)||(b>n)) //如果输入错误{ cout<<"输入的编号过大,请重新输入:";cin>>a>>b;}charge(a,b);cout<<"是否继续(是请输入'y',否则请输入'n'):";cin>>quit;}return 0;}void Initqueue(cirularQueue<int> &Q,int m) //初始化队列{ for(int i=1;i<=m;i++)Q.push(i);}void display(int m,int n){ cirularQueue<int> man(m+1);cirularQueue<int> woman(n+1);Initqueue(man,m);Initqueue(woman,n);cout<<"请输入曲目数:";cin>>songnum;cout<<"每曲的配对情况为:"<<endl;for(int k=1;k<=songnum;k++){ int x=0,y=0; //男生和女生的编号man.Pop(x); //男生按顺序出对跳舞woman.Pop(y); //女生按顺序出对跳舞cout<<"第"<<k<<"曲:\t"<<x<<"号男生<->"<<y<<"号女生"<<endl; //他们在一起跳舞man.push(x); //跳完舞后男生再次进入队列等在下一次跳舞woman.push(y); //跳完舞后男生再次进入队列等在下一次跳舞}}void charge(int a,int b){ int count=0; //定义舞曲计数以记录他们能在第几曲时在一起跳舞cirularQueue<int> man1(m+1);cirularQueue<int> woman1(n+1);Initqueue(man1,m);Initqueue(woman1,n);while(count<=songnum){ int x, y;count++;man1.Pop(x);woman1.Pop(y);man1.push(x);woman1.push(y);if((x==a)&&(y==b)){ cout<<"第"<<count<<"首曲:\t"<<a<<"号男生<->"<<b<<"号女生"<<endl;break;}}//如果他们在这个舞会上不能在一起跳舞,则输出if(count==songnum+1)cout<<"他们在这个舞会上不可能在一起跳舞"<<endl;}五、测试结果:六、总结:本设计采用的是循环队列的基本操作顺利的解决学生舞曲搭配问题,主要利用用循环队列的环状结构,循环地执行出列入列操作并在出队列时进行配对并输出配对情况,而整个过程不需要不需要移动元素使程序在空间复杂度上降到最小,采用指针的移动大大加快了程序的执行效率。