问题:
利用循环队列模拟舞伴配对问题:在舞会上,男、女各自排成一队。舞会开始时。依次从男队和女队的队头各出一人配成舞伴。如果两队初始人数不等,则较长的那一队中未配对者等待下一轮舞曲。
ih#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#define MAXSIZE 100
typedef struct
{
char name[20];
}dancer;
typedef struct
{
dancer * base;//分配空间
int font;//头指针
int rear;//尾指针
}queue;
void init(queue * q)//构造一个空队列
{
q->base = (dancer *)malloc(MAXSIZE*sizeof(dancer));
if(!q->base)//分配失败则退出程序
exit(-1);
q->font = q->rear = 0;//队列空,头指针,尾指针指向同一位置
}
void inqueue(queue * q,dancer e)//插入
{
if((q->rear+1)%MAXSIZE == q->font)//队列满则退出程序
exit(-1);
q->base[q->rear] = e;
q->rear = (q->rear+1)%MAXSIZE;//插入后移动尾指针
}
void outqueue(queue * q,dancer * e)//删除
{
if(q->font == q->rear)//队列为空则退出程序
exit(-1);
* e = q->base[q->font];
q->font = (q->font+1)%MAXSIZE;//移动头指针
}
dancer get1(queue * q)//获取队首元素
{
dancer e;
if(q->font != q->rear)
e = q->base[q->font];
return e;
}
dancer get2(queue * q)//获取第二个元素
{
dancer e;
e = q->base[q->font+1];
return e;
}
int main(void)
{
queue q1,q2;//q1为男生队列,q2为女生队列
dancer d1[5],d2[3];//假设有5名男生,3名女生
dancer e1,e2;
int i,a,j;
init(&q1);
init(&q2);
//输入男生,女生的名字
printf("请输入5名男生的名字:\n");
for(i = 0;i<5;++i)
{
scanf("%s",d1[i].name);
inqueue(&q1,d1[i]);
}
printf("请输入3名女生的名字:\n");
for(i=0;i<3;++i)
{
scanf("%s",d2[i].name);
inqueue(&q2,d2[i]);
}
printf("请输入舞会的轮数:\n");
scanf("%d",&a);
for(i=0;i<a;++i)
{
printf("第%d轮的配对情况是:\n",i+1);
//出队后需要再入队,保证下一轮配对的进行
for(j=0;j<3;++j)
{
outqueue(&q1,&e1);
inqueue(&q1,e1);
outqueue(&q2,&e2);
inqueue(&q2,e2);
printf("%s-----%s\n",e1.name,e2.name);
}
printf("%s和%s等待下一轮\n",get1(&q1).name,get2(&q1).name);//输出下一轮等待的人,并不是出队,只需要获取值即可
}
return 0;
}