#include<stdio.h>//问题(用循环队列实现)//
#define queuesize 100
typedef struct //定义结构体-人员信息//
{
char name[20];
char sex;
} datatype;
typedef struct //定义结构体-循环队列//
{
int front;
int rear;
int count;
datatype dancers[queuesize];
} cirqueue;
void initqueue(cirqueue *q)//建立空队列//
{
q->front=q->rear=NULL;
q->count=0;
}
int queueempty(cirqueue *q)//判断队列是否为空,为空返回1,否则返回0//
{
return q->count==NULL;
}
void enqueue(cirqueue *q,datatype p)//进队函数,使p进入队列//
{
q->count++;
q->dancers[q->rear]=p;
q->rear=(q->rear+1)%queuesize;
}
datatype dequeue(cirqueue *q)//出队函数,用p返回出队值//
{
datatype p;
while(!queueempty(q))
{
p=q->dancers[q->front];
q->count--;
q->front=(q->front++)%queuesize;
return p;
}
}
datatype queuefront(cirqueue *q)//访问队头元素//
{
return q->dancers[q->front];
}
//
void dancepartners(datatype dancers[],int num)
{
int i;
datatype p;
cirqueue maledancer,femaledancer;//定义两个循环队列结构体//
initqueue(&maledancer);//调用initqueue()函数置空队列maledancer//
initqueue(&femaledancer);//调用initqueue()函数置空队列femaledancer//
for(i=0;i<num;i++)
{
p=dancers[i];//结构体整体赋值//
if(p.sex=='f')//乙的进队列femaledancer//
{
enqueue(&femaledancer,p);
printf("%s进乙队\n",p.name);
}
else//甲的进队列maledancer//
{
enqueue(&maledancer,p);
printf("%s进甲队\n",p.name);
}
}
printf("配对情况如下:\n");
while (!queueempty(&femaledancer)&&!queueempty(&maledancer))//当两个队列都不为空时,出队配对//
{
p=dequeue(&maledancer);
printf("甲:%s",p.name);
p=dequeue(&femaledancer);
printf("和乙:%s配对成功\n",p.name);
}
if(!queueempty(&femaledancer))//乙队不为空,输出乙队第一个等待人姓名//
{
printf("乙队中还有%d个人在等待!\n",femaledancer.count);
p=queuefront(&femaledancer);
printf("乙队中第一个等待的是:%s\n",p.name);
}
else if(!queueempty(&maledancer))//甲不为空,输出甲队第一个等待人姓名//
{
printf("甲队中还有%d个人在等待!\n",maledancer.count);
p=queuefront(&maledancer);
printf("甲队中第一个等待的是:%s\n",p.name);
}
else printf("^-^没有人剩余^-^!\n");
}
void main()
{
datatype p,dancers[queuesize];
int i,num;
printf("输入甲乙的总人数:\n");
scanf("%d",&num);
dancepartners(&dancers[0],num);
getchar();
}