舞伴问题代码

问题描述:

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

#include<iostream>
#define OVERFLOW -1
#define Maxsize 100
using namespace std;
typedef struct {
	char name[20];
	char sex;
}Dancer;
typedef struct QNode{
	Dancer data;
	struct QNode* next;
}QNode,*QuePtr;
typedef struct {
	QuePtr front;
	QuePtr rear;
}LinkQue;
void InitQue(LinkQue& Q) {
	Q.front = Q.rear = new QNode;
	if (!Q.front)
		exit(OVERFLOW);
	Q.front->next = NULL;
}
bool QueEmpty(LinkQue& Q) {
	return(Q.front->next==NULL);
}
//出队
void DeQue(LinkQue& Q,Dancer &d) {
	if (QueEmpty(Q))
		return;
	QuePtr p = Q.front->next;
	d = p->data;
	Q.front->next = p->next;
	delete p;
}
//入队
void EnQue(LinkQue& Q,Dancer d) {
	QuePtr s = new QNode;
	s->data = d;
	Q.rear->next = s;
	Q.rear = s;
	s->next = NULL;
}
//取队头
Dancer GetHead(LinkQue Q) {
	return(Q.front->next->data);
}
void DancingPartner(LinkQue &Mdancers,LinkQue &Fdancers,Dancer d[],int num) {
	Dancer p;
	for (int i = 0; i < num; i++) {
		p = d[i];
		if (p.sex == 'F')
			EnQue(Fdancers, p);
		else
			EnQue(Mdancers, p);
	}
	cout << "舞伴配对为 男/女:\n";
	//当男女舞者均不为空时,分别出队配对
	while (!QueEmpty(Mdancers) && !QueEmpty(Fdancers)) {
		DeQue(Mdancers, p);
		cout << p.name << " ";
		DeQue(Fdancers, p);
		cout << p.name << endl;
	}
	if (!QueEmpty(Fdancers)) {
		p = GetHead(Fdancers);
		cout << "下一轮第一个获得舞伴的是:" << p.name << endl;
	}
	else if (!QueEmpty(Mdancers)) {
		p = GetHead(Mdancers);
		cout << "下一轮第一个获得舞伴的是:" << p.name << endl;
	}

}
int main() {
	Dancer d[Maxsize];
	LinkQue Mdancers;
	LinkQue Fdancers;
	InitQue(Mdancers);
	InitQue(Fdancers);
	printf("请输入各个跳舞人的姓名和性别('F'表示女性,'M'表示男性):\n");
	for (int i = 0; i < 5; i++)
	{
		printf("请输入第%d个跳舞人的姓名和性别:\n", i + 1);
		cin >> d[i].name;
		cin>>d[i].sex;
	}
	DancingPartner(Mdancers, Fdancers, d, 5);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值