学生搭配问题论文.doc
《学生搭配问题论文.doc》由会员分享,可在线阅读,更多相关《学生搭配问题论文.doc(13页珍藏版)》请在冰豆网上搜索。
![学生搭配问题论文.doc](https://file1.bdocx.com/fileroot1/2022-10/3/265bbd5d-f75e-43c6-b332-3a8400454b31/265bbd5d-f75e-43c6-b332-3a8400454b311.gif)
滨江学院
《数据结构》课程设计
题目学生搭配问题
学号20102344070
姓名曾艺
专业软件工程
指导教师
组号宣文霞
课题描述:
一.题目的内容及要求
1.题目内容
一班有m个女生,有n个男生(m不等于n),现要开一个舞会。
男女生分别编号坐在舞池的两边的椅子上,每曲开始时,依次从男生和女生中各出一人配对跳舞,本曲没成功配对者坐着等待下一曲找舞伴。
请设计一系统模拟动态地显示出上述过程。
2.题目要求
(1)输出每曲配对情况
(2)计算出任何一个男生(编号为X)和任意女生(编号为Y),在第K曲配对跳舞的情况。
至少求出K的两个值。
二.需求分析
本课题要对数目不等的男生女生跳舞进行搭配,设计需要解决每一首曲子男生女生的搭配情况,要采用循环队列的模式来解决,男生和女生各在两个循环的队列中,每首曲子开始,便在两个队首各取一人成功配对跳舞,并进入队尾,等待下一次配对。
例如:
(3男5女情况)
第一首:
男1和女1
第二首:
男2和女2
.........
第四首:
男1和女4
三.概要设计
1.队列(Queue)是只允许在一端进行插入,而在另一端进行删除的运算受限的线性表。
循环队列是在队列的顺序存储结构中,除了用乙组地址连续的存储单元依次存放从队列头到队列尾的元素外,尚需附设两个指针front和rear分别指示队列头元素和队列尾元素的位置。
循环队列两个,将男生、女生两组人分别存放,以实现循环配对输出。
循环队列的入队,出队,判队满,判队空。
首先,要模拟动态地显示出现题目中所要求的循环,我们要先建立两个循环队列SqQueue和SqQueue2。
然后,将男生、女生两组人分别存入这两个队列。
以实现他们的循环配对输出,这是循环队列固有的特性。
接着,利用循环队列的特性,将男女生分别进行入队列和出队列操作,且实现搭配输出。
循环队列的长度分别设为男女生的个数即可。
最后,在计算机终端输出的结果是:
根据要求输出男生女生搭配情况
主要是循环队列的应用
数据模型为逻辑结构:
循环队列两个,将男生、女生两组人分别存放,以实现循环配对输出。
存储结构为循环链表
核心算法是循环队列的入队,出队,判队满,判队空。
输入数据为男生人数、女生人数,歌曲数量
输出数据为每一首歌曲播放时,男生和女生搭配情况,只输出编号即可。
当要查找的男女搭配时输出歌曲编号,和他们搭配的总次数。
通过以上分析,该程序具有可行性。
2.各模块函数介绍:
1)classcirularQueue
作用:
定义一个一个循环队列
2)~cirularQueue()
作用:
定义析构函数,使对象在撤销时释放
3)boolIsFull()
作用:
判断队列是否已满
4)boolIsEmpty()
作用:
判断队列是否为空,用于出队列前使用
5)voidpush(Tinfo)
作用:
入队。
每对舞伴跳完舞之后,做入队处理,到达队尾,等待下次跳舞。
6)voidPop(T&info)
作用:
出队。
每取曲子响起时男生队列和女生队列作出队处理,两人跳舞。
7)voidGetHead(T&info)
作用:
取队首元素,对出队的男女进行识别。
8)voidInitqueue(cirularQueue&,int);
作用:
初始化队列
9)voiddisplay(int,int);
作用:
根据男生和女生的人数和曲目的数目,来判断每曲歌的男女配对情况
10)voidcharge(int,int);
作用:
判断指定组合能否配对成功
2.主函数调用关系图
voidGetHead(T&info)
classcirularQueue
~cirularQueue()
主函数
k曲配对
每曲配对
数据输入
输出
编号
voidpush(Tinfo)
voidPop(T&info)
boolIsFull()
IsEmpty()
初始化男女循环队列
3.每曲配对函数调用关系图voiddisplay(int,int)
k<=songnumm
man.pop(x)
woman.pop(y)
否
是
输出k首男x女y跳舞
end
k++
4.第k曲配对函数调用图voidcharge(int,int)
输出他们不会一起跳
break
end
count<=songnumm
man.pop(x)
woman.pop(y)
count++
初始化男女循环队列
(x==a)&&
(y==b)
man.push(x)
woman.push(y)
男a女b第count跳
5.队满判断boolIsFull()
首尾顺序相邻
队列为满
6.对空判断原则boolIsEmpty()
首尾指针相等
队列为空
7.入队流程voidpush(Tinfo)
不能入队
队满
队尾进入
尾指针移到
8.出队流程voidPop(T&info)
不能出队
队空
队头出列
头指针移到
四.详细设计
1.算法的流程图
2.建立两个链式循环队列来分别存储男生和女生,然后调用入队出队函数实现循环队列的配对输出。
充分利用向量空间,将向量空间想象为一个首尾相接的圆环,存储在其中成为循环队列。
在循环队列中进行出队、入队操作时,头尾指针仍要加1,朝前移动。
只不过当头尾指针指向向量上界时、其加1操作是指向向量的下界。
这样就可以通过出队再入队来实现男生女生的循环搭配。
课程设计过程中的关键算法如下:
(1)关键算法之一:
初始化队列
voidInitQ(LinkQueue&Q)
{
QueuePtrp;
p=(QueuePtr)malloc(sizeof(QNode));
Q.front=p;
Q.rear=p;
Q.front->next=NULL;
}
(2)关键算法之二:
入队函数
voidEnQueue(LinkQueue&Q,intnum)//入队函数
{
QueuePtrp;
p=(QueuePtr)malloc(sizeof(QNode));
p->num=num;
p->next=NULL;
Q.rear->next=p;
Q.rear=p;
}
(3)关键算法之三:
出队函数
voidDeQueue(LinkQueue&Q,int&num)//出队函数
{
QueuePtrp,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首曲子时女队的情况
voidprintF(LinkQueue&F,inti)//输出第i首曲子时女队的情况
{
QueuePtrp;
intn=1;
while(n
{
printf("_");
n++;
}
p=F.front->next;
while(F.rear!
=p)
{
printf("%d",p->num);
p=p->next;}
printf("%d\n",p->num);
五.源代码
#include
#include
#include
#include
#defineMAXSIZE60
#defineTRUE1
#defineFALSE0
#defineOK1
#defineERROR0
#defineOVERFLOW-1
typedefintsystem;
typedefstructQNode{
intnum;
structQNode*next;
}QNode,*QueuePtr;
typedefstruct{
QueuePtrfront;
QueuePtrrear;
}LinkQueue;
voidsleep(clock_twait)//延迟函数
{
clock_tgoal;
goal=wait+clock();
while(goal>clock());
}
voidInitQ(LinkQueue&Q)//建立空队列
{
QueuePtrp;
p=(QueuePtr)malloc(sizeof(QNode));
Q.front=p;
Q.rear=p;
Q.front->next=NULL;
}
voidEnQueue(LinkQueue&Q,intnum)
{
QueuePtrp;
p=(QueuePtr)malloc(sizeof(QNode));
p->num=num;
p->next=NULL;
Q.rear->next=p;
Q.rear=p;
}
voidDeQueue(LinkQueue&Q,int&num)
{
QueuePtrp,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);
}
voidprintF(LinkQueue&F,inti)//打印第i首曲子时女队的情况
{
QueuePtrp;
in