C语言数据结构之栈与队列的应用(3)
循环队列的应用——舞伴配对问题:在舞会上,男、女各自排成一队。舞会开始时,依次从男队和女队的队头各出一人配成舞伴。如果两队初始人数不等,则较长的那一队中未配对者等待下一轮舞曲。假设初始男、女人数及性别已经固定,舞会的轮数从键盘输入。试模拟解决上述舞伴配对问题。要求:从屏幕输出每一轮舞伴配对名单,如果在该轮有未配对的,能够从屏幕显示下一轮第一个出场的未配对者的姓名。
//舞伴配对问题 #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); }
不为失败找原因,要为成功找方法!