舞伴问题(c-数据结构)

题目

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

思路

该题我们采用队列存储男舞伴和女舞伴的信息,分别定义一个男舞伴的队列和女舞伴的队列,按照性别对舞伴信息进行分别入队。在分配舞伴时,从队头开始,当两个队列都不为空时,男舞伴的队列和女舞伴的队列分别出队一人,组成舞伴。最后通过判断队列是否为空,来输出舞伴分配情况。

代码

#include<stdio.h>
#include<string.h>
#define MAXSIZE 1000  //队列大小 

//存储舞伴信息的结构体 
typedef struct{
	char name[20];
	char sex;
}Person; 

//存储队列信息的结构体 
typedef struct{
	Person *person; 
	int front;//队头 
	int tail;//队尾 
}Point; 


Person man[MAXSIZE];//存储男舞伴的队列 
Person woman[MAXSIZE];//存储女舞伴的队列 

Point manPoint;//男舞伴队列的信息 
Point womanPoint;//女舞伴队列的信息 

void Init(); //初始化队列信息 
void pushQueue(Point *p1,Person p2);//入队 
void outQueue(Point*p1,char *name);//出队 
void getHead(Point *p1,char *name);//获取队中首元素 
void Dance();//分配舞伴 

int main()
{
	int n;
	Person x; 
	printf("请输入跳舞的总人数:");
	scanf("%d",&n);
	printf("请输入跳舞的人的姓名和性别('F'为男性,'M为女性')\n");
	Init();
	//输入跳舞的人信息并对应入队 
	for(int i=0;i<n;i++){
		scanf("%s %c",x.name,&x.sex);
		if(x.sex=='F'){
			pushQueue(&manPoint,x);
		}else if(x.sex=='M'){
			pushQueue(&womanPoint,x);
		}
	}
	Dance();//分配舞伴 
}
//初始化队列信息 
void Init()
{
	manPoint.person=man;
	manPoint.front=0;
	manPoint.tail=0;
	womanPoint.person=woman;
	womanPoint.front=0;
	womanPoint.tail=0;
}
//入队
void pushQueue(Point *p1,Person p2)
{
	if(p1->tail+1==p1->front) return;
	p1->person[p1->tail++]=p2;
}
//出队 
void outQueue(Point*p1,char *name)
{
	if(p1->front==p1->tail) return;
	strcpy(name,p1->person[p1->front++].name);
}
//获取队中首元素
void getHead(Point *p1,char *name)
{
	strcpy(name,p1->person[p1->front].name);
}

//分配舞伴
void Dance()
{
	char s1[20];
	printf("已分配的舞伴:\n");
	//分配舞伴并输出 
	while((manPoint.front!=manPoint.tail)&&(womanPoint.front!=womanPoint.tail)){		
		outQueue(&manPoint,s1);
		printf("%s ",s1);
		outQueue(&womanPoint,s1);
		printf("%s\n",s1);
	}
	//判断是否还有人未分配舞伴,并记录下一次谁先分配到舞伴 
	int flag=0;
	if(manPoint.front!=manPoint.tail){
		flag=1;
		getHead(&manPoint,s1);
	}
	if(womanPoint.front!=womanPoint.tail){
		flag=1;
		getHead(&womanPoint,s1);
	}
	if(flag){
		printf("下一次分配舞伴时%s最先分配到舞伴",s1);
	}else{
		printf("当前舞伴正好完全分配!");
	}
}
  • 2
    点赞
  • 54
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

漠–

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值