循环队列的应用——舞伴配对问题

循环队列的应用——舞伴配对问题

在舞会上,男、女各自排成一队。舞会开始时,依次从男队和女队的队头各出一人配成舞伴。如果两队初始人数不等,则较长的那一队中未配对者等待下一轮舞曲。假设初始男、女人数及性别已经固定,舞会的轮数从键盘输入。试模拟解决上述舞伴配对问题。要求:从屏幕输出每一轮舞伴配对名单,如果在该轮有未配对的,能够从屏幕显示下一轮第一个出场的未配对者的姓名。(分别依次输入男姓名、女姓名,并输出每轮配对结果,以下为一次标准输入输出,两队人数由主函数固定)

输入第1个男人名:a

输入第2个男人名:b

输入第3个男人名:c

输入第4个男人名:d

输出男人队列:a b c d

输入第1个女人名:A

输入第2个女人名:B

输入第3个女人名:C

输入第4个女人名:D

输入第5个女人名:E

输入第6个女人名:F

输出女人队列:A B C D E F

配对者:a–A

配对者:b–B

配对者:c–C

配对者:d–D

未配对的第一个出来的是:E

配对者:a–E

配对者:b–F

配对者:c–A

配对者:d–B

未配对的第一个出来的是:C

配对者:a–C

配对者:b–D

配对者:c–E

配对者:d–F

未配对的第一个出来的是:A

#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100
typedef struct  Queue
{    
	char data[MAXSIZE];    
	int front,rear;
}STQ;
STQ *InitQueue()
{       
	STQ *p = (STQ*)malloc(sizeof(STQ));    
	p->front = 0;    
	p->rear = 0;    
	return p;
}
void EnQueue(STQ *TQ,int t_num,char t_name)
{        
	if ((TQ->rear+1)%t_num == TQ->front)        
	{                
		TQ->data[TQ->rear] = t_name;        
		TQ->rear = (TQ->rear+1)%t_num;                       
		return ;        
	}        
	TQ->data[TQ->rear] = t_name;        
	TQ->rear = (TQ->rear+1)%t_num;
}
void DeQueue(STQ *TQ,int t_num)
{        
	if (TQ->front == TQ->rear)        
	{                
		TQ->front = (TQ->front+1)%t_num;                        
		return ;        
	}        
	TQ->front = (TQ->front+1)%t_num;
}
void Match(STQ *TQ1,STQ *TQ2,int num)
{    
	int j,i;    
	for (i=0;i<num;i++)    
	{            
		for (j=0;j<4;j++)        
		{            
			printf("配对者:%c--%c\n", TQ1->data[TQ1->front], TQ2->data[TQ2->front]);            
			char d = TQ2->data[TQ2->front];            
			DeQueue(TQ2,6);            
			EnQueue(TQ2,6,d);            
			char g = TQ1->data[TQ1->front];            
			DeQueue(TQ1,4);            
			EnQueue(TQ1,4,g);        
		}        
		printf("未配对的第一个出来的是:%c\n", TQ2->data[TQ2->front]);    
	}
}
int main()
{    
	STQ *Q1,*Q2;    
	int n;    
	char name1[100],name2[100];    
	int i;    
	Q1 = InitQueue(); //男    
	Q2 = InitQueue(); //女    
	printf("输入配对轮数:");    
	scanf("%d", &n);    
	getchar();    
	for (i=0;i<4;i++)    
	{        
		printf("输入第%d个男人名:\n", i+1);        
		scanf("%c", &name1[i]);        
		getchar();        
		EnQueue(Q1,4,name1[i]);    
	}    
	for (i=0;i<6;i++)    
	{        
		printf("输入第%d个女人名:\n", i+1);        
		scanf("%c", &name2[i]);        
		getchar();        
		EnQueue(Q2,6,name2[i]);    
	}    
	Match(Q1,Q2,n);    
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值