舞伴问题.docx
- 文档编号:30072247
- 上传时间:2023-08-04
- 格式:DOCX
- 页数:13
- 大小:100KB
舞伴问题.docx
《舞伴问题.docx》由会员分享,可在线阅读,更多相关《舞伴问题.docx(13页珍藏版)》请在冰豆网上搜索。
舞伴问题
《数据结构》
课程设计报告书
题目:
舞伴问题
专业:
计算机科学与技术
学号:
学生姓名:
指导教师:
完成日期:
2016-06-20
舞伴问题
1.题目描述
该程序主要实现以下功能:
假设在周末舞会上,男士们和女士们进入舞厅时,各自排成一队,跳舞开始时,依次从男队和女队的队头上各出一人配成舞伴,若两队初始人数不相同,则较长的那一队中未配对者等待下一轮舞曲。
2.预备知识
①voidInitQueue(Queue&Q);
②intEmptyQueue(QueueQ);
③voidEnQueue(Queue&Q,ElemTypeitem);
④ElemTypeOutQueue(Queue&Q);
⑤ElemTypePeekQueue(QueueQ);
⑥voidClearQueue(Queue&Q);
3.问题分析
a)由键盘输入数据,每对数据包括姓名和性别;
b)输出结果包括配成舞伴的女士和男士的姓名,以及未配对者的队伍名称和队头者的姓名;
要求利用主函数中已实现的顺序循环队列的基本操作函数来实现。
函数voidpartner()在主函数中进行调用测试。
程序流程和设计思想可以用以下流程图来描述:
图1.程序运行流程图
4.数据结构设计
抽象数据类型定义:
typedefstruct
{
charsex;//'M代表男、F代表女'
charname[20];//存储姓名
}people;
typedefstruct
{
people*queue;
intfront;//队头指针
intrear;//队尾指针
intcount;//数组Q的当前长度
intMaxSize;
}Queue;
队列的基本操作可包括:
①voidInitQueue(Queue&Q);//构造一个空队列Q
②intEmptyQueue(QueueQ);
//判断队列Q是否为空,若空返回1,否则返回0
③voidEnQueue(Queue&Q,ElemTypeitem);//元素item进队列Q
④ElemTypeOutQueue(Queue&Q);//队头元素出队列Q,并返回其值
⑤ElemTypePeekQueue(QueueQ);//返回队头元素值
⑥voidClearQueue(Queue&Q);//清空队列
5.模块设计
1voidInitQueue(Queue&Q);//构造一个空队列Q
{
Q.MaxSize=11;
Q.queue=(people*)malloc(Q.MaxSize*sizeof(people));
Q.rear=Q.front=0;
Q.count=0;
}
2intEmptyQueue(QueueQ);
//判断队列Q是否为空,若空返回1,否则返回0
{
returnQ.front==Q.rear;
}
3voidEnQueue(Queue&Q,ElemTypeitem);//元素item进队列Q
{
Q.count++;
if((Q.rear+1)%Q.MaxSize==Q.front)
{//空间不足,扩大2倍
intk=sizeof(people);
Q.queue=(people*)realloc(Q.queue,2*Q.MaxSize*k);
if(Q.rear!
=Q.MaxSize-1){//移动队列内容,必须要做
for(inti=0;i<=Q.rear;i++)
Q.queue[i+Q.MaxSize]=Q.queue[i];
Q.rear=Q.rear+Q.MaxSize;
}
Q.MaxSize=2*Q.MaxSize;//修改队列最大空间
}
Q.rear=(Q.rear+1)%Q.MaxSize;//元素入队
Q.queue[Q.rear]=p;
}
4ElemTypeOutQueue(Queue&Q);//队头元素出队列Q,并返回其值
{
if(Q.front==Q.rear)
{
printf("队列已空无数据元素出队列!
\n");
exit
(1);
}
//先修改front位置,后取走元素
Q.count--;
Q.front=(Q.front+1)%Q.MaxSize;
returnQ.queue[Q.front];
}
5ElemTypePeekQueue(QueueQ);//返回队头元素值
{
if(Q.front==Q.rear)
{
printf("队列已空,无法读取!
\n");
exit
(1);
}
//直接取走元素,不修改front位置,
returnQ.queue[Q.front];
}
6voidClearQueue(Queue&Q);//清空队列
{
free(Q.queue);//清空队列
Q.front=Q.rear=Q.MaxSize=Q.count=0;//将数值都赋值为0
}
6.运行界面及运行结果
图6-1
图6-2
图6-3
附录:
#include
#include
#include
typedefstruct
{
charsex;//'M代表男、F代表女'
charname[20];//存储姓名
}people;
typedefstruct
{
people*queue;
intfront;//队头指针
intrear;//队尾指针
intcount;//数组Q的当前长度
intMaxSize;
}Queue;
voidInitQueue(Queue&Q)//构造一个空队列Q
{
Q.MaxSize=11;
Q.queue=(people*)malloc(Q.MaxSize*sizeof(people));
Q.rear=Q.front=0;
Q.count=0;
}
intEmptyQueue(QueueQ)//判断队列Q是否为空,若空返回1,否则返回0
{
returnQ.front==Q.rear;
}
voidEnQueue(Queue&Q,peoplep)//元素p进队列Q
{
Q.count++;
if((Q.rear+1)%Q.MaxSize==Q.front)
{//空间不足,扩大2倍
intk=sizeof(people);
Q.queue=(people*)realloc(Q.queue,2*Q.MaxSize*k);
if(Q.rear!
=Q.MaxSize-1){//移动队列内容,必须要做
for(inti=0;i<=Q.rear;i++)
Q.queue[i+Q.MaxSize]=Q.queue[i];
Q.rear=Q.rear+Q.MaxSize;
}
Q.MaxSize=2*Q.MaxSize;//修改队列最大空间
}
Q.rear=(Q.rear+1)%Q.MaxSize;//元素入队
Q.queue[Q.rear]=p;
}
peopleOutQueue(Queue&Q)//队头元素出队列Q,并用返回其值
{
if(Q.front==Q.rear)
{
printf("队列已空无数据元素出队列!
\n");
exit
(1);
}
//先修改front位置,后取走元素
Q.count--;
Q.front=(Q.front+1)%Q.MaxSize;
returnQ.queue[Q.front];
}
peoplePeekQueue(QueueQ)//返回队头元素值
{
if(Q.front==Q.rear)
{
printf("队列已空,无法读取!
\n");
exit
(1);
}
//直接取走元素,不修改front位置,
returnQ.queue[Q.front];
}
voidClearQueue(Queue&Q)//清空队列
{
free(Q.queue);//清空队列
Q.front=Q.rear=Q.MaxSize=Q.count=0;//将数值都赋值为0
}
voidpartner(peoplequeue[],intcount)//舞伴配对函数
{
inti;
peoplep;
Queuemalequeue,femalequeue;//定义两个循环队列
InitQueue(malequeue);//置男空队列
InitQueue(femalequeue);//置女空队列
for(i=0;i { p=queue[i]; if(p.sex=='F') { EnQueue(femalequeue,p);//女生进女队 } else { EnQueue(malequeue,p);//男生进男队 } } printf("D: 舞伴配对情况如下: \n"); while(! EmptyQueue(femalequeue)&&! EmptyQueue(malequeue))//当两队都不为空队时候 { p=OutQueue(malequeue); printf("%s,",p.name); p=OutQueue(femalequeue); printf("%s\n",p.name); } //两队中有空的情况: if(! EmptyQueue(femalequeue))//当女队不为空的时候,输出等待姓名 { printf("E: 女队中还有%d个人在等待! \n",femalequeue.count); p=OutQueue(femalequeue); printf("F: %s将是下轮得到舞伴的第一人\n",p.name); } elseif(! EmptyQueue(malequeue))//当女队为空但男队不为空的时候 { printf("E: 男队中还有%d个人在等待! \n",malequeue.count); p=OutQueue(malequeue); printf("F: %s将是下轮得到舞伴的第一人\n",p.name); } else printf("E: 所有人都有舞伴,没有人剩余,O(∩_∩)O哈哈~\n"); } intmain(void) { peoplequeue[100]; inti,num; printf("A: 输入跳舞人数的总人数: "); scanf("%d",&num); printf("B: 关于性别: F代表女,M代表男\n"); printf("C: 输入姓名和性别,如: aaF\n"); for(i=0;i { scanf("%s",queue[i].name); getchar();//作用是空格输入多少都无所谓 scanf("%c",&queue[i].sex); if(queue[i].sex! ='F'&&queue[i].sex! ='M'){//判断信息输入是否合法 printf("第%d个人的信息输入错误,请重新输入\n",i+1); //其实这个步骤有执行,只是因为输入错误,所以重新输入,所以i不变 i--; } } partner(queue,num); return0; }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 舞伴 问题