编辑代码

#include<stdio.h>
#include<stdlib.h>

#define MAXSIZE 100    //队列可能达到的最大长度
#define OK  1
#define ERROR  0
#define OVERFLOW -2

typedef int  Status;

typedef struct{
	char name [20]; //姓名
}Person; 

typedef struct{ 
	Person *base; //队列中数据元素类型为Person
	int front; //头指针
	int rear;  //尾指针
}SqQueue; 

Status InitQueue (SqQueue *Q) 
{//构造一个空队列Q
	Q->base=(Person *)malloc(MAXSIZE*sizeof(Person));//为队列分配一个最大容量为MAXSIZE的数组空间
	if(!Q->base) exit(OVERFLOW);//存储分配失败
	Q->front=Q->rear=0;//头指针和尾指针置为零、队列为空
	return OK;
}

Status EnQueue(SqQueue *Q, Person e) 
{//插入元素e为Q的新的队尾元素
	if ((Q->rear+1)%MAXSIZE==Q->front)//尾指针在循环意义上加1后等于头指针,表明队满
	return ERROR; 
	Q->base[Q->rear]=e;//新元素插入队尾
	Q->rear=(Q->rear+1)%MAXSIZE;//队尾指针加1
	return OK; 
}

Status DeQueue(SqQueue *Q, Person *e) 
{//删除Q的队头元素,用e返回其值
	if(Q->front==Q->rear) return ERROR; //队空
	*e=Q->base[Q->front]; //保存队头元素
	Q->front=(Q->front+1)%MAXSIZE; //队头指针加1
	return OK;
}

Person GetHead(SqQueue Q) 
{//返回Q的队头元素,不修改队头指针
	if(Q.front!=Q.rear) //队列非空
	return Q.base[Q.front]; //返回队头元素的值,队头指针不变
}

Status QueueEmpty(SqQueue Q)
{//判断队列是否为空
	if(Q.front==Q.rear) return OK;//队列空,返回1
	else return ERROR;//队列不空,返回0
}

void DancePartner(Person Fdancer[],Person Mdancer[],int num,int num1,int num2) 
{//结构数组dancer中存放跳舞的男女,num是跳舞的人数。
	SqQueue Mdancers,Fdancers;
	Person p;
    Person q;
	int i;
	InitQueue(&Mdancers); //男士队列初始化
	InitQueue(&Fdancers); //女士队列初始化
	for(i=0;i<num1;i++) //依次将跳舞者根据其性别人队
	{
		p=Fdancer[i]; 
		EnQueue(&Mdancers,p); //插人男队
	}
    for(i=0;i<num2;i++) //依次将跳舞者根据其性别人队
	{
		p=Mdancer[i]; 
		EnQueue(&Fdancers,p); //插入女队
	}
	for(i=0;i<num;i++)
    {
        while(!QueueEmpty(Fdancers)&&!QueueEmpty(Mdancers)) 
	    {
            DeQueue(&Fdancers,&p); //女士出队
		    DeQueue(&Mdancers,&q); //男士出队
            printf("配对的舞者:%s %s\n",p.name,q.name);
        }
	if (!QueueEmpty(Fdancers)) //女士队列非空,输出队头女士的姓名
	{
		p=GetHead(Fdancers); //取女士队头
		printf("第一个出场的未配对的舞者姓名: %s\n", p.name);
	}
	else if (!QueueEmpty (Mdancers)) //男士队列非空,输出队头男士的姓名
	{
		p=GetHead(Mdancers); //取男士队头
		printf("第一个出场的未配对的舞者姓名: %s\n", p.name); 
	}
}
int main()
{
	Person Mdancer[MAXSIZE];
    int j,i,num,num1,num2;
    printf("男队:\n");     //男士
	printf("输入跳舞人数:");
	scanf("%d",&num1);
	printf("输入跳舞者的姓名:\n");
	for(i=0;i<num1;i++)
	{
		scanf("%s",&Mdancer[i].name);
	}
    Person Fdancer[MAXSIZE];       
    printf("女队:\n");       //女士
	printf("输入跳舞人数:");
	scanf("%d",&num2);
	printf("输入跳舞者的姓名:\n");
	for(j=0;j<num2;j++)
	{
		scanf("%s",&Fdancer[j].name);
	}
    printf("请输入舞会的论数:");
    scanf("%d",&num);
	DancePartner(Fdancer,Mdancer,num,num1,num2);
	return 0;
}