舞伴匹配问题

#include <stdio.h>
#include <iostream>
using namespace std;
# define MAXSIZE 100
typedef struct {
	char name[10];
	char sex;		    //M表示男性,F表示女性
}Person;
typedef struct {
	Person *base;
	int front;         //指向队头元素
	int rear;          //指向队尾元素相当于指针
}SqQueue;
void InitSqQueue(SqQueue &Q){
	Q.base=new Person[MAXSIZE];
	if(!Q.base){
		printf("分配内存失败");
		exit(0);
	}
	Q.front=Q.rear=0;
}
int IsEmpty(SqQueue &Q){
	if(Q.front==Q.rear){
		return 1;
	}else
		return 0;
}
int QueueLength(SqQueue &Q){
	return (Q.rear-Q.front+MAXSIZE)%MAXSIZE;
}
void EnQueue(SqQueue &Q,Person e){
	if((Q.rear+1)%MAXSIZE==Q.front){
		printf("队列已满");
	}
	Q.base[Q.rear]=e;
	Q.rear=(Q.rear+1)%MAXSIZE;        //通过取模操作将队列弄成循环
}
Person GetFront(SqQueue &Q){
	if(Q.front==Q.rear){
		printf("队列是空的");
		exit(0);
	}
	return Q.base[Q.front];
}
void DeQueue(SqQueue &Q,Person &e){
	if(Q.front==Q.rear){
		printf("队列是空的");
	}else{
		e=Q.base[Q.front];
		Q.front=(Q.front+1)%MAXSIZE;
	}
}
void DancePartner(Person *Dancer,int& num,SqQueue MQ,SqQueue FQ){
	Person e;
	for(int i=0;i<num;i++){                //通过性别分配对组
		if(Dancer[i].sex=='M'){
			EnQueue(MQ,Dancer[i]);
		}
		else
			EnQueue(FQ,Dancer[i]);	
	}
	cout<<"The dancing partners are:"<<endl;
	while(!IsEmpty(MQ)&&!IsEmpty(FQ)){        //舞伴匹配
		DeQueue(FQ,e);
		cout<<e.name<<"+";
		DeQueue(MQ,e);
		cout<<e.name<<endl;
	}
}
int main(){
	SqQueue MQ,FQ;
	InitSqQueue(MQ);
	InitSqQueue(FQ);
	while(1){
		Person *Dancer;int num=0;   //每次配队人数在30以内
		Dancer=new Person[30];
		printf("舞伴配队;请输入人员信息性别 名字\n");
		printf("一次信息录入以#结束\n");
		while(1){                    //要先输入性别F/M
			cin>>Dancer[num].sex;
			if(Dancer[num].sex=='#')
				break;
			cin>>Dancer[num].name;
			num++;
		}
		DancePartner(Dancer,num,MQ,FQ);
		printf("继续按1,退出按0\n");
		cin>>num;
		if(num==0)
			break;
	}	
	return 0;
}


    顺序存储结构 -----循环队列
    通过取模运算 ,头指针和尾指
    针就可以在顺序表空间内以头尾
    衔接的方式"循环"移动
    //少用一个元素空间来分辨队空还是队满
    Q.front==Q.rear  队空
    (Q.rear+1)%MAXSIZE==Q.front 队满

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值