数据结构课设学生搭配问题Word文件下载.docx
《数据结构课设学生搭配问题Word文件下载.docx》由会员分享,可在线阅读,更多相关《数据结构课设学生搭配问题Word文件下载.docx(17页珍藏版)》请在冰豆网上搜索。
男2和女2
.........
:
第四首:
男1和女4
二、总体结构设计:
为实现上述功能和目的,要用到循环队列的相关知识,同时,要定义一定的抽的数据类型,主函数调用各个函数模块
1.各模块函数介绍:
1)classcirularQueue
作用:
定义一个一个循环队列
?
2)~cirularQueue()
定义析构函数,使对象在撤销时释放
3)boolIsFull()
判断队列是否已满
4)boolIsEmpty()
判断队列是否为空,用于出队列前使用
5)voidpush(Tinfo)
入队。
每对舞伴跳完舞之后,做入队处理,到达队尾,等待下次跳舞。
6)voidPop(T&
info)
出队。
每取曲子响起时男生队列和女生队列作出队处理,两人跳舞。
》
7)voidGetHead(T&
取队首元素,对出队的男女进行识别。
8)voidInitqueue(cirularQueue<
int>
&
int);
初始化队列
9)voiddisplay(int,int);
根据男生和女生的人数和曲目的数目,来判断每曲歌的男女配对情况
10)voidcharge(int,int);
作用:
判断指定组合能否配对成功
2.本程序包含三个模块:
;
1)主程序模块:
voidmain()
{
初始化;
do{
接受命令;
处理命令;
}while(“命令”=”退出”)
—
}
2)、集合单元模块——实现集合的各个函数模块
3)、结点结构单元模块——定义集合的结点结构
三、各子模块设计:
1主函数调用关系图
图main()
·
2初始化示意
否
~
|
图voidInitqueue(cirularQueue<
&
Q,intm)
3每曲配对函数调用关系图voiddisplay(int,int)
!
否
是
%
图voiddisplay(int,int)
4第k曲配对函数调用图voidcharge(int,int)
图voidcharge(int,int)
4队满判断boolIsFull()
5对空判断原则boolIsEmpty()
6入队流程voidpush(Tinfo)
(
7出队流程voidPop(T&
info)
8.取队首元素代码voidGetHead(T&
四、编程实现:
#include<
iostream>
template<
classT>
"
classcirularQueue//定义一个一个循环队列
{private:
intMaxSize;
intfront;
//头指针
intrear;
//尾指针
T*data;
public:
cirularQueue(intMaxLength)
{MaxSize=MaxLength;
front=rear=0;
data=newT[MaxLength];
~cirularQueue()//定义析构函数,使对象在撤销时释放
{front=rear=0;
delete[]data;
voidInitqueue()//队列的申明
{for(inti=0;
i<
maxSize-1;
i++)
push(i);
}
)
boolIsFull()//判断队列是否已满
{if((rear+1)%MaxSize==front)
returntrue;
elsereturnfalse;
boolIsEmpty()//判断队列是否为空
{if(front==rear)
voidpush(Tinfo)//入队
{if(IsFull())
{cout<
<
错误!
队列已满!
endl;
exit(-1);
else
{data[rear]=info;
rear=(rear+1)%MaxSize;
@
voidPop(T&
info)//出队
{if(IsEmpty())
队列为空!
{info=data[front];
front=(front+1)%MaxSize;
#
voidGetHead(T&
info)//取队首元素
{if(IsEmpty())
exit(-1);
};
:
voidInitqueue(cirularQueue<
voiddisplay(int,int);
voidcharge(int,int);
usingnamespacestd;
staticintsongnum=0;
//定义歌曲的数量并初始化为0
staticintm=0,n=0;
//男生和女生的人数
intmain()//主函数
{cout<
请分别输入男生和女生的人数:
;
cin>
>
m>
n;
display(m,n);
inta=0,b=0;
//男生和女生的编号,以判断他们在第几首歌时能在一起跳舞
charquit='
y'
//判断是否继续输入,如果继续输入,则输入'
否则输入'
n'
while(quit!
='
请输入男生和女生的编号:
a>
b;
while((a>
m)||(b>
n))//如果输入错误
输入的编号过大,请重新输入:
}
charge(a,b);
cout<
是否继续(是请输入'
否则请输入'
):
quit;
return0;
Q,intm)//初始化队列
{for(inti=1;
=m;
(i);
voiddisplay(intm,intn)
{cirularQueue<
man(m+1);
cirularQueue<
woman(n+1);
Initqueue(man,m);
Initqueue(woman,n);
cout<
请输入曲目数:
songnum;
每曲的配对情况为:
for(intk=1;
k<
=songnum;
k++)
{intx=0,y=0;
//男生和女生的编号
(x);
//男生按顺序出对跳舞
(y);
//女生按顺序出对跳舞
第"
曲:
\t"
x<
号男生<
->
y<
号女生"
//他们在一起跳舞
//跳完舞后男生再次进入队列等在下一次跳舞
voidcharge(inta,intb)
{intcount=0;
//定义舞曲计数以记录他们能在第几曲时在一起跳舞
man1(m+1);
woman1(n+1);
Initqueue(man1,m);
Initqueue(woman1,n);
while(count<
=songnum)
{intx,y;
count++;
if((x==a)&
(y==b))
{cout<
count<
首曲:
a<
b<
break;
}
//如果他们在这个舞会上不能在一起跳舞,则输出
if(count==songnum+1)
他们在这个舞会上不可能在一起跳舞"
,
五、测试结果:
六、总结:
本设计采用的是循环队列的基本操作顺利的解决学生舞曲搭配问题,主要利用用循环队列的环状结构,循环地执行出列入列操作并在出队列时进行配对并输出配对情况,而整个过程不需要不需要移动元素使程序在空间复杂度上降到最小,采用指针的移动大大加快了程序的执行效率。
并且对输入进行了改进,以防止用户随意输入时出现的各种意想不到的错误。
本次程序设计中所用语言为C++,程序开始定义了类cirular,其中有头指针,尾指针及数据域等。
随之定义了析构函数,释放对象,然后进行了队列的基本操作,有队列的申明,判断队空及队满,出队,入队,其核心是display()函数和charge()函数,其中display()用于对各位同学编号和每队的输出情况,charge()用于计算已编号的同学在第几曲中进行配对。
循环队列是一种环状的队列并且对头元素指向队尾元素,学生搭配问题是典型的只有采用循环队列才能解决的问题,实验表明该算法的空间复杂度优于其他算法。
通过这次实验,我发现自己在数据结构这方面真是知之甚少,以前学习的知识也多有遗忘。
与其说这是一次学习,倒不如说这是一次检测。
所以,这次实验让我很好的认清自己对数据结构这门课学习程度如何,知道自己哪些方面还存在不足、对该学科重视程度还不够,以后要努力学习。
对一学期的学习的数据结构通过这次实训,虽然并没有掌握的非常好,但是对某些重点需要掌握和了解的还是有了深入的探讨,也让我明白学的东西再多也要学会运用,通过实例去探讨可能比理论上更容易理解。
七、参考文献
《实用数据结构基础(第二版)》陈元春等中国铁道出版社
《C++程序》
谭浩强编著
2004年6月第1版