循环队列的应用——舞伴配对问题:在舞会上,男、女各自排成一队。舞会开始时,依次从男队和女队的队头各出一人配成舞伴。如果两队初始人数不等,则较长的那一队中未配对者等待下一轮舞曲。假设初始男、女人数及性别已经固定,舞会的轮数从键盘输入。试模拟解决上述舞伴配对问题。要求:从屏幕输出每一轮舞伴配对名单,如果在该轮有未配对的,能够从屏幕显示下一轮第一个出场的未配对者的姓名。
//舞伴配对问题
#define MAXSIZE 10
typedef struct
{
int *base;
int front,rear;
}Man;
typedef struct
{
char *base;
int front,rear;
}Woman;
void ManQueue(Man &Q,int m)//建立一个男人队列
{
Q.base =(int *)malloc(sizeof(int)*MAXSIZE);
if(!Q.base )return;
Q.front =Q.rear =0;
for(int i=0;i<m;i++)
{
printf("输入第%d个男人名:",i+1);
scanf("%d",&Q.base[Q.rear]);
Q.rear =(Q.rear +1)% MAXSIZE;
}
printf("输出男人队列:");
for(i=0;i<m;i++)
printf("%d ",Q.base[i]);
printf("\n");
}
void WomanQueue(Woman &Q,int n)//建立一个女人队列
{
Q.base =(char *)malloc(sizeof(char)*MAXSIZE);
if(!Q.base )return;
Q.front =Q.rear =0;
getchar();
for(int i=0;i<n;i++)
{
printf("输入第%d个女人名:",i+1);
scanf("%c",&Q.base[Q.rear]);
Q.rear =(Q.rear +1)% MAXSIZE;
getchar();
}
printf("输出女人队列:");
for(i=0;i<n;i++)
printf("%c ",Q.base[i]);
printf("\n");
}
void peidui(Man Q1,Woman Q2,int m,int n,int k)//配对——k表示第几轮
{
int min,Mname;
char Wname;
if(m>n) min=n;else min=m;
for(int i=1;i<=k;i++)//第几轮
{
for(int j=0;j<min;j++)
{
Mname=Q1.base[Q1.front];
Wname=Q2.base[Q2.front];
Q1.front=(Q1.front+1)%MAXSIZE;
Q2.front=(Q2.front+1)%MAXSIZE;
printf("配对者:%d--%c\n",Mname,Wname);
Q1.base [Q1.rear] =Mname;
Q1.rear =(Q1.rear +1)%MAXSIZE;
Q2.base [Q2.rear] =Wname;
Q2.rear =(Q2.rear +1)%MAXSIZE;
}
if(m>n)//男人多
{
printf("未配对的第一个出来的是:%d\n",Q1.base[Q1.front]);
}
else//女人多
{
printf("未配对的第一个出来的是:%c\n",Q2.base[Q2.front]);
}
}
}
void main()
{
Man Q1;
Woman Q2;
ManQueue(Q1,4);
WomanQueue(Q2,6);
peidui(Q1,Q2,4,6,3);
}