1、数 据 结 构课程设计报告书班级 学号 专业 姓名 课题描述:一、 需求分析:1.设计内容一班有 m 个女生,有 n 个男生 (m 不等于 n),现要开一个舞会. 男女生分别编号坐在舞池的两边的椅子上.每曲开始时,依次从男生和女生中各出一人配对跳舞, 本曲没成功配对者坐着等待下一曲找舞伴.请设计一系统模拟动态地显示出上述过程,要求如下:1) 输出每曲配对情况2) 计算出任何一个男生( 编号为 X)和任意女生(编号为 Y),在第 K 曲配对跳舞的 情况.至少求出 K 的两个值.3) 尽量设计出多种算法及程序,可视情况适当加分2.需求本课题要对数目不等的男生女生跳舞进行搭配,设计需要解决每一首曲子
2、 男生女生的搭配情况,要采用循环队列的模式来解决,男生和女生各在两个循环的队列中,每首曲子开始,便在两个队首各取一人成功配对跳舞,并进入队尾, 等待下一次配对。例如:(3 男 5 女情况) 第一首:男 1 和女 1第二首:男 2 和女 2.第四首:男 1 和女 4二、 总体结构设计:为实现上述功能和目的,要用到循环队列的相关知识,同时,要定义一定的抽的数据类型,主函数调用各个函数模块1.各模块函数介绍:1)class cirularQueue 作用:定义一个一个循环队列2)cirularQueue() 作用:定义析构函数,使对象在撤销时释放3)bool IsFull() 作用:判断队列是否已满
3、4)bool IsEmpty() 作用:判断队列是否为空,用于出队列前使用5)void push(T info) 作用:入队。每对舞伴跳完舞之后,做入队处理,到达队尾,等待下次跳舞。6)void Pop(T 作用:初始化队列9)void display(int,int);作用:根据男生和女生的人数和曲目的数目,来判断每曲歌的男女配对情况10)void charge(int,int);作用:判断指定组合能否配对成功2.本程序包含三个模块:1)主程序模块:void main()初始化;do接受命令;处理命令;while(“命令”=”退出”) 2)、集合单元模块实现集合的各个函数模块3)、结点结构单
4、元模块定义集合的结点结构三、 各子模块设计:1 主函数调用关系图主函数k 曲配对每曲配对数据输入输出编号图 main()class cirularQueuecirularQueue()void Pop(T int front; /头指针int rear; /尾指针T *data;public:cirularQueue(int MaxLength) MaxSize=MaxLength;front=rear=0;data=new TMaxLength;cirularQueue() /定义析构函数,使对象在撤销时释放 front=rear=0;delete data;void Initqueue()
5、 /队列的申明不能入队队满队尾进入 尾指针移到不能出队队空队头出列 头指针移到 for(int i=0;ivoid display(int,int);void charge(int,int);using namespace std;static int songnum=0; /定义歌曲的数量并初始化为 0static int m=0,n=0; /男生和女生的人数 int main() /主函数 coutmn;display(m,n);int a=0,b=0; /男生和女生的编号,以判断他们在第几首歌时能在一起跳舞char quit=y; /判断是否继续输入,如果继续输入,则输入y;否则输入nw
6、hile(quit!=n) coutab;while(am)|(bn) /如果输入错误 coutab; charge(a,b);coutquit;return 0;void Initqueue(cirularQueue i man(m+1);cirularQueue woman(n+1);Initqueue(man,m);Initqueue(woman,n);coutsongnum;cout“ man1(m+1);cirularQueue woman1(n+1);Initqueue(man1,m);Initqueue(woman1,n);while(count“b“号女生“endl;break
7、;/如果他们在这个舞会上不能在一起跳舞,则输出if(count=songnum+1)cout“他们在这个舞会上不可能在一起跳舞“endl;五、 测试结果:六、 总结:本设计采用的是循环队列的基本操作顺利的解决学生舞曲搭配问题,主要利用用循环队列的环状结构,循环地执行出列入列操作并在出队列时进行配对并输出配对情况,而整个过程不需要不需要移动元素使程序在空间复杂度上降到最小,采用指针的移动大大加快了程序的执行效率。并且对输入进行了改进,以防止用户随意输入时出现的各种意想不到的错误。本次程序设计中所用语言为 C+,程序开始定义了类 cirular,其中有头指针,尾指针及数据域等。随之定义了析构函数,
8、释放对象,然后进行了队列的基本操作,有队列的申明,判断队空及队满,出队,入队,其核心是 display()函数和 charge()函数,其中display()用于对各位同学编号和每队的输出情况,charge()用于计算已编号的同学在第几曲中进行配对。循环队列是一种环状的队列并且对头元素指向队尾元素,学生搭配问题是典型的只有采用循环队列才能解决的问题,实验表明该算法的空间复杂度优于其他算法。通过这次实验,我发现自己在数据结构这方面真是知之甚少,以前学习的知识也多有遗忘。与其说这是一次学习,倒不如说这是一次检测。所以,这次实验让我很好的认清自己对数据结构这门课学习程度如何,知道自己哪些方面还存在不足、对该学科重视程度还不够,以后要努力学习。对一学期的学习的数据结构通过这次实训,虽然并没有掌握的非常好,但是对某些重点需要掌握和了解的还是有了深入的探讨,也让我明白学的东西再多也要学会运用,通过实例去探讨可能比理论上更容易理解。七、 参考文献实用数据结构基础(第二版) 陈元春等 中国铁道出版社C+程序 谭浩强编著 2004 年 6 月第 1 版