在舞会上,男、女各自排成一队。舞会开始时,依次从男队和女队的队头各出一人配成舞伴。如果两队初始人数不等,则较长的那一队中未配对者等待下一轮舞曲。假设初始男、女人数及性别已经固定,舞会的轮数从键盘输入。试模拟解决上述舞伴配对问题。要求:从屏幕输出每一轮舞伴配对名单,如果在该轮有未配对的,能够从屏幕显示下一轮第一个出场的未配对者的姓名。
#include<stdio.h>
#include<stdlib.h>
#define MAX 10
typedef struct{
char name[20];
char sex;//f女 m男
}People;
typedef struct{
People *base;
int front;
int rear;
}SqQueue;
void Init_Queue(SqQueue &s,int n){
s.base=(People *)malloc(MAX*sizeof(People));
printf("输入名字和性别:\n");
for(int i=0;i<n;i++){
scanf("%s",&s.base[i].name);
getchar();
scanf("%c",&s.base[i].sex);
}
s.front=0;s.rear=n-1;
}
void OutQueue(SqQueue &s1,SqQueue &s2,int n1,int n2){//输出配对人员的姓名
printf("%s ",s1.base[s1.front].name);
printf("%c ",s1.base[s1.front].sex);
printf("%s ",s2.base[s2.front].name);
printf("%c",s2.base[s2.front].sex);
putchar('\n');
s1.front=(s1.front+1)%n1;
s2.front=(s2.front+1)%n2;
}
void DancePartner(SqQueue &s1,SqQueue &s2,int t,int n1,int n2){//舞伴配对
while(t){
int i=1;
printf("配对\n");
while(s1.front!=s1.rear&&s2.front!=s2.rear){
OutQueue(s1,s2,n1,n2);
}
if(s1.front==(s1.rear)){
OutQueue(s1,s2,n1,n2);
printf("第%d轮为配对\n",i);
printf("%s %c\n",s2.base[s2.front].name,s2.base[s2.front].sex);
}
else{
if(s2.front==(s2.rear)){
OutQueue(s1,s2,n1,n2);
printf("第%d轮为配对\n",i);
printf("%s %c\n",s1.base[s1.front].name,s1.base[s1.front].sex);
}
}
printf("===================\n");
t--;
i++;
}
}
int main(){
SqQueue s1,s2;
int times,num1,num2;
scanf("%d%d%d",&num1,&num2,×);
Init_Queue(s1,num1);
Init_Queue(s2,num2);
DancePartner(s1,s2,times,num1,num2);
return 0;
}