#include<bits/stdc++.h>
using namespace std;
#define OK 1
#define ERROR 0
#define TRUE 1
#define FLASE 0
//舞者名字,姓名结构体
typedef struct{
char name[20];
char sex;
}Person;
typedef int Status;
typedef Person QElemType;
//链队结构体
typedef struct QNode{
QElemType date;
struct QNode *next;
}QNode,*QueuePtr;
typedef struct{
QueuePtr front;
QueuePtr rear;
}LinkQueue;
//初始化链队
Status InitQueue(LinkQueue &Q){
Q.front=Q.rear=new QNode; //生成新节点作为头结点,队头和队尾指针指向此节点
Q.front->next=NULL; //头结点的指针域置空
return OK;
}
//入队
Status EnQueue(LinkQueue &Q,QElemType e){
QueuePtr p;
p=new QNode; //为入队元素分配节点空间,用指针P指向
p->date=e; //将新节点的数据域值为e
p->next=NULL;Q.rear->next=p; //将新节点插入到队尾
Q.rear=p; //修改队尾指针
return OK;
}
//出队
Status DeQueue(LinkQueue &Q,QElemType &e){
//删除Q的队头元素,用e返回其值
QueuePtr p=new QNode;
if(Q.front==Q.rear) return ERROR; //若队列空,返回ERROR
p=Q.front->next; //p指向队头元素
e=p->date; //e保存队头元素的值
Q.front->next=p->next; //修改头结点的指针域
if(Q.rear==p) //最后一个元素被删,队尾指针指向头结点
Q.rear=Q.front;
delete p; //释放原队头元素的空间
return OK;
}
//取链队的队头元素
QElemType GetHead(LinkQueue Q){
if(Q.front!=Q.rear) //队列非空
return Q.front->next->date; //返回队头元素的值,队头指针不变
}
//判断队是否为空
Status QueueEmpty(LinkQueue Q){
if(Q.front==Q.rear)
return TRUE;
else return FLASE;
}
void DancePartner(Person dancer[],int num){
int i;
Person p;
LinkQueue Mdancers,Fdancers;
InitQueue(Mdancers); //男士队列初始化
InitQueue(Fdancers); //女士队列初始化
for(i=0;i<num;i++){ //依次将跳舞者根据性别入队
p=dancer[i];
if(p.sex=='F') EnQueue(Fdancers,p); //插入女队
else EnQueue(Mdancers,p); //插入男队
}
cout<<"舞伴是 :\n";
//cout<<QueueEmpty(Fdancers)<<QueueEmpty(Mdancers)<<endl;
while(!QueueEmpty(Fdancers)&&!QueueEmpty(Mdancers)){
//依次输入男女舞伴姓名
DeQueue(Fdancers,p); //女士出队
cout<<p.name<<" and "; //输出出队女士姓名
DeQueue(Mdancers,p); //男士出队
cout<<p.name<<endl; //输出出队男士姓名
}
if(!QueueEmpty(Fdancers)){ //女士队列非空,输出队头女士的姓名
p=GetHead(Fdancers); //取女士队头
cout<<p.name<<" 正在等待舞伴."<<endl;
}
else if(!QueueEmpty(Mdancers)){ //男士队列非空,输出队头男士的姓名
p=GetHead(Mdancers); //取男士队头
cout<<p.name<<" 正在等待舞伴."<<endl;
}
}
int main(){
int i,num;
Person dancer[100];
cout<<"请输入跳舞的总人数:";
cin>>num;
while(num<=0)
{
cout<<"您的输入错误,请重新输入跳舞的人数:";
cin>>num;
}
for(i=1;i<=num;i++)
{
cout<<"请输入第"<<i<<"位舞者的名字:"<<endl;
cin>>dancer[i-1].name;
cout<<"请输入第"<<i<<"个人的性别(F or M):"<<endl;
cin>>dancer[i-1].sex;
while(dancer[i-1].sex!='F'&&dancer[i-1].sex!='M')
{
cout<<"*******输入错误,请重新输入:\n";
cout<<dancer[i-1].sex;
cout<<"请输入第"<<i<<"个舞者的性别(F/M):"<<endl;
cin>>dancer[i-1].sex;
break;
}
}
DancePartner(dancer,num);
return 0;
}