/*
舞伴配对问题
来舞蹈室的顺序:
男-姓名1;男-姓名2;女-姓名3;男-姓名4;
女-姓名5;男-姓名6;男-姓名7;女-姓名8;
最终配对顺序:
男1-女3;男2-女5;男4-女8;男;男;
实验过程:->main函数
1.建立舞者结构体,依次往队列里加入人员信息(8个人,5男3女)-scanf,struct
2.进行配对->函数功能:配对
(1)初始化两个队列——InitQueue()
(2)根据性别,分别向两个队列里插入元素——EnQueue()
(3)按照(男,女)、(男、女)...这样的顺序出队——DeQueue(),printf;若其中一个队列为空,另一个队列直接出队——QueueEmpty()
*/
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 100
typedef struct
{
char name[20];
char sex;
}Dancer;
typedef struct
{
Dancer *base;
int front;
int rear;
}SqQueue;
//初始化
int InitQueue(SqQueue *Q)
{
Q->base=(Dancer *)malloc(sizeof(Dancer)*MAXSIZE);
if(!Q->base) return 0;
Q->front=Q->rear=0;
return 1;
}
//入队
int EnQueue(SqQueue *Q,Dancer e)
{
if((Q->rear+1)%MAXSIZE==Q->front) return 0;
Q->base[Q->rear]=e;
Q->rear=(Q->rear+1)%MAXSIZE;
return 1;
}
//出队
int DeQueue(SqQueue *Q,Dancer *e)
{
if(Q->front==Q->rear) return 0;
*e=Q->base[Q->front];
Q->front=(Q->front+1)%MAXSIZE;
return 1;
}
//判空
int QueueEmpty(SqQueue Q)
{
if(Q.rear==Q.front) return 1;
else return 0;
}
int main()
{
char a;
SqQueue Men,Women;
Dancer P,e1,e2;
InitQueue(&Men);
InitQueue(&Women);
printf("请来到的舞友签到,输入姓名和性别(m/w),我们将会按照到来的次序为您安排舞伴:");
for(int i=0;i<8;i++)
{
printf("\n姓名:");
scanf("%s",P.name);
scanf("%c",&a);
printf("性别:");
scanf("%c",&P.sex);
if(P.sex=='m')
EnQueue(&Men,P);
if(P.sex=='w')
EnQueue(&Women,P);
}
printf("\n下面是配对信息:");
while(!QueueEmpty(Men)&&!QueueEmpty(Women))
{
DeQueue(&Men,&e1);
DeQueue(&Women,&e2);
printf("\n%s(%c)&%s(%c)",e1.name,e1.sex,e2.name,e2.sex);
}
while(!QueueEmpty(Men))
{
DeQueue(&Men,&e1);
printf("\n%s(%c)",e1.name,e1.sex);
}
while(!QueueEmpty(Women))
{
DeQueue(&Women,&e2);
printf("\n%s(%c)",e2.name,e2.sex);
}
return 0;
}