利用循环队列模拟舞伴配对问题:在舞会上,男、女各自排成一队。舞会开始时。依次从男队和女队的队头各出一人配成舞伴。如果两队初始人数不等,则较长的那一队中未配对者等待下一轮舞曲。

 #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(“输入男女dancer的总人数:\n”);

scanf(“%d”,&num);

printf(“输入姓名和性别,如: \nzhangsan\nm\n”);

for(i=0;i<num;i++)

{

scanf(“%s”,&dancers[i].name);

getchar();

scanf(“%c”,&dancers[i].sex);

if(dancers[i].sex!=’f’&&dancers[i].sex!=’m’)//判断输入信息是否合法//

printf(“第%d个人的信息有误,请重新输入”,i–);

}

dancepartners(&dancers[0],num);

getchar();

}

《利用循环队列模拟舞伴配对问题:在舞会上,男、女各自排成一队。舞会开始时。依次从男队和女队的队头各出一人配成舞伴。如果两队初始人数不等,则较长的那一队中未配对者等待下一轮舞曲。》

    原文作者:舞伴问题
    原文地址: https://blog.csdn.net/wang_hong_jun/article/details/6892111
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞