舞伴配对问题

一问题描述

 假设在周末舞会上,男士们和女士们进入舞厅时,各自排成一队。跳舞开始时,依次从男队和女队的队头上各出一人配成舞伴。若两队初始人数不相同,则较长的那一队中未配对者等待下一轮舞曲。现要求写一算法模拟上述舞伴配对问题。

二 完整代码

#include<stdio.h>
#include<malloc.h>
#include<string.h>
#define MaxNumber 100
typedef struct
{
    char name[10];
    char sex;//性别F表示男,M表示女
}Person;
typedef Person DataType;//将队列中元素的数据类型改为Person

typedef struct
{
    int front ;//头指针,队非空时指向队头元素
    int rear ;//尾指针,队非空时指向队尾元素的下一位置
    int count;//计数器,记录队中元素总数
    DataType data[MaxNumber];
}CirQueue;
//初始化队列
void InitQueue(CirQueue *Q)
{
    Q->front = Q->rear = 0;
    Q->count = 0;//计数器置0
}
//判断队列空
int QueueEmpty(CirQueue *Q)
{
    return Q->count == 0;//队列无元素
}
//判断队列满
int QueueFull(CirQueue *Q)
{
    return Q->count == MaxNumber;//队列中元素个数等于最大数时队满
}
//入队列
void EnQueue(CirQueue *Q,DataType x)
{
    if(QueueFull(Q))
    {
        printf("Queue overflow");//队满上溢
        exit(1);
    }
    Q->count++;//队列元素个数加1;
    Q->data[Q->rear] = x;//新元素插入队尾
    Q->rear = (Q->rear+1)%MaxNumber;//循环意义下尾指针加1
}
//出队列
DataType DeQueue(CirQueue *Q)
{
    DataType temp;
    if(QueueEmpty(Q))
    {
        printf("Queue underflow");//队空下溢
        exit(1);
    }
    temp = Q->data[Q->front];
    Q->count--;
    Q->front = (Q->front+1)%MaxNumber;
    return temp;
}
//取队头元素
DataType QueueFront(CirQueue *Q)
{
    if(QueueEmpty(Q))
    {
        printf("Queue is empty");
        exit(1);
    }
    return Q->data[Q->front];
}

void DancePartner(Person dancer[],int num)
{//结构数组中dancer中存放跳舞的男女,num是跳舞人数
    int i;
    Person p;
    CirQueue Mdancer,Fdancer;
    InitQueue(&Mdancer);
    InitQueue(&Fdancer);//男女队列初始化
    for(i=0;i<num;i++)//将舞者性别入队
    {
        p = dancer[i];
        if(p.sex=='F')
           {
               EnQueue(&Fdancer,p);//女队
               printf("%s进入女生队列\n",p.name);
           }
        else if(p.sex=='M')
        {
              EnQueue(&Mdancer,p);//男队
              printf("%s进入男生队列\n",p.name);

        }
        else
        {
            printf("含有无效的输入,请重新来过!\n");
            exit(1);
        }

    }
    printf("\n成功匹配的舞伴是:\n");
    while(!QueueEmpty(&Fdancer)&&!QueueEmpty(&Mdancer))
    {
        //依次输出男女舞伴名
        p = DeQueue(&Fdancer);
        printf("%s  ",p.name);
        p = DeQueue(&Mdancer);
        printf("%s\n",p.name);
    }
    if(!QueueEmpty(&Fdancer))//输出女生剩余人数及队头女生名字
       {
           printf("有%d个女生正在等待下一轮 \n",Fdancer.count);
           p = QueueFront(&Fdancer);//取队头
           printf("%s将要第一个获得舞伴\n",p.name);
       }
    else if(!QueueEmpty(&Mdancer))
    {
           printf("有%d个男生正在等待下一轮 \n",Mdancer.count);
           p = QueueFront(&Mdancer);//取队头
           printf("%s将要第一个获得舞伴\n",p.name);
    }
}
int  main()
 {
    int DancersNum,i;
    Person Dancers[MaxNumber];
    printf("请输入参加跳舞的总人数:\n");
    scanf("%d",&DancersNum);
    for(i=0;i<DancersNum;i++)
    {
        printf("请输入性别(F or M):\n");
        scanf("%s",&(Dancers[i].sex));
        printf("请输入姓名:\n");
        scanf("%s",&(Dancers[i].name));
    }



   //DancersNum=GetDancersInfo(Dancers);
   if(DancersNum!=0)
    DancePartner(Dancers,DancersNum);
   return 0;
}

运行截图


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值