一问题描述
运行截图
假设在周末舞会上,男士们和女士们进入舞厅时,各自排成一队。跳舞开始时,依次从男队和女队的队头上各出一人配成舞伴。若两队初始人数不相同,则较长的那一队中未配对者等待下一轮舞曲。现要求写一算法模拟上述舞伴配对问题。
二 完整代码
#include<stdio.h>
#include<malloc.h>
#include<string.h>
#define MaxNumber 100
typedef struct
{
char name[10];
char sex;//性别F表示男,M表示女
}Person;
typedef Person DataType;//将队列中元素的数据类型改为Person
typedef struct
{
int front ;//头指针,队非空时指向队头元素
int rear ;//尾指针,队非空时指向队尾元素的下一位置
int count;//计数器,记录队中元素总数
DataType data[MaxNumber];
}CirQueue;
//初始化队列
void InitQueue(CirQueue *Q)
{
Q->front = Q->rear = 0;
Q->count = 0;//计数器置0
}
//判断队列空
int QueueEmpty(CirQueue *Q)
{
return Q->count == 0;//队列无元素
}
//判断队列满
int QueueFull(CirQueue *Q)
{
return Q->count == MaxNumber;//队列中元素个数等于最大数时队满
}
//入队列
void EnQueue(CirQueue *Q,DataType x)
{
if(QueueFull(Q))
{
printf("Queue overflow");//队满上溢
exit(1);
}
Q->count++;//队列元素个数加1;
Q->data[Q->rear] = x;//新元素插入队尾
Q->rear = (Q->rear+1)%MaxNumber;//循环意义下尾指针加1
}
//出队列
DataType DeQueue(CirQueue *Q)
{
DataType temp;
if(QueueEmpty(Q))
{
printf("Queue underflow");//队空下溢
exit(1);
}
temp = Q->data[Q->front];
Q->count--;
Q->front = (Q->front+1)%MaxNumber;
return temp;
}
//取队头元素
DataType QueueFront(CirQueue *Q)
{
if(QueueEmpty(Q))
{
printf("Queue is empty");
exit(1);
}
return Q->data[Q->front];
}
void DancePartner(Person dancer[],int num)
{//结构数组中dancer中存放跳舞的男女,num是跳舞人数
int i;
Person p;
CirQueue Mdancer,Fdancer;
InitQueue(&Mdancer);
InitQueue(&Fdancer);//男女队列初始化
for(i=0;i<num;i++)//将舞者性别入队
{
p = dancer[i];
if(p.sex=='F')
{
EnQueue(&Fdancer,p);//女队
printf("%s进入女生队列\n",p.name);
}
else if(p.sex=='M')
{
EnQueue(&Mdancer,p);//男队
printf("%s进入男生队列\n",p.name);
}
else
{
printf("含有无效的输入,请重新来过!\n");
exit(1);
}
}
printf("\n成功匹配的舞伴是:\n");
while(!QueueEmpty(&Fdancer)&&!QueueEmpty(&Mdancer))
{
//依次输出男女舞伴名
p = DeQueue(&Fdancer);
printf("%s ",p.name);
p = DeQueue(&Mdancer);
printf("%s\n",p.name);
}
if(!QueueEmpty(&Fdancer))//输出女生剩余人数及队头女生名字
{
printf("有%d个女生正在等待下一轮 \n",Fdancer.count);
p = QueueFront(&Fdancer);//取队头
printf("%s将要第一个获得舞伴\n",p.name);
}
else if(!QueueEmpty(&Mdancer))
{
printf("有%d个男生正在等待下一轮 \n",Mdancer.count);
p = QueueFront(&Mdancer);//取队头
printf("%s将要第一个获得舞伴\n",p.name);
}
}
int main()
{
int DancersNum,i;
Person Dancers[MaxNumber];
printf("请输入参加跳舞的总人数:\n");
scanf("%d",&DancersNum);
for(i=0;i<DancersNum;i++)
{
printf("请输入性别(F or M):\n");
scanf("%s",&(Dancers[i].sex));
printf("请输入姓名:\n");
scanf("%s",&(Dancers[i].name));
}
//DancersNum=GetDancersInfo(Dancers);
if(DancersNum!=0)
DancePartner(Dancers,DancersNum);
return 0;
}
运行截图