舞伴配对问题

循环队列的应用——舞伴配对问题:在舞会上,男、女各自排成一队。舞会开始时,依次从男队和女队的队头各出一人配成舞伴。如果两队初始人数不等,则较长的那一队中未配对者等待下一轮舞曲。假设初始男、女人数及性别已经固定,舞会的轮数从键盘输入。试模拟解决上述舞伴配对问题。要求:从屏幕输出每一轮舞伴配对名单,如果在该轮有未配对的,能够从屏幕显示下一轮第一个出场的未配对者的姓名。

//循环队列的常用函数
#include<stdio.h>
#include<stdlib.h>
#define Maxsize 100
typedef struct{
   int *base;
   int front;
   int rear;
   int k;      //记录初始位置
}squeue;
int a,b,i,j,n,m1,m2,m;
void Initqueue(squeue &Q)
{
   Q.base=(int*)malloc(Maxsize*sizeof(int));
   if (!Q.base)
	   exit(1);
   Q.front=Q.rear=Q.k=0;
}
void Push(squeue &Q,int e)
{
   if ((Q.rear+1)%Maxsize==Q.front)   //队满处理
			return;
   Q.base[Q.rear]=e;
   Q.rear=(Q.rear+1)%Maxsize;
}
void Pop(squeue &Q,int &e)
{
   if (Q.rear==Q.front)			 //判空处理
	   return;
   e=Q.base[Q.front];
   Q.front=(Q.front+1)%Maxsize;
   if (Q.front==Q.rear)
   {
      Q.front=Q.k;
   }
}
void GetHead(squeue Q)
{
   printf("%d\n",Q.base[Q.front]);
}
int main()
{
   squeue Q,P;
   Initqueue(P);
   Initqueue(Q);
   printf("请输入舞会轮数:\n");
   scanf("%d",&n);
   printf("请输入男生人数:\n");
   scanf("%d",&m1);
   printf("请对男生进行编号:\n");
   for (i=1;i<=m1;i++)
   {
         scanf("%d",&P.base[i]);
        Push(P,P.base[i]);
   }
   printf("请输入女生人数:\n");
   scanf("%d",&m2);
   for (i=1;i<=m2;i++)
   {
       scanf("%d",&Q.base[i]);
       Push(Q,Q.base[i]);
   }
   m=m1<m2?m1:m2;
   for (i=1;i<=n;i++)
   {
        printf("第%d轮舞会:\n",i);
       for (j=1;j<=m;j++)
   {
       Pop(P,a);
       Pop(Q,b);
       printf("%d %d\n",a,b);
   }
   }
	return 0;
}

    原文作者:舞伴问题
    原文地址: https://blog.csdn.net/zyq_19960204/article/details/49539311
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞