循環隊列的應用--舞伴配對

在舞會上,男、女各自排成一隊。舞會開始時,依次從男隊和女隊的隊頭各出一人配成舞伴。如果兩隊初始人數不等,則較長的那一隊中未配對者等待下一輪舞曲。假設初始男、女人數及性別已經固定,舞會的輪數從鍵盤輸入。試模擬解決上述舞伴配對問題。要求:從屏幕輸出每一輪舞伴配對名單,如果在該輪有未配對的,能夠從屏幕顯示下一輪第一個出場的未配對者的姓名。

#include<stdio.h>
#include<stdlib.h>
#define MAX 10
typedef struct{
	char name[20];
	char sex;//f女 m男
}People;

typedef struct{
	 People *base;
	 int front;
	 int rear;
}SqQueue;

void Init_Queue(SqQueue &s,int n){
	s.base=(People *)malloc(MAX*sizeof(People));
	printf("輸入名字和性別:\n");
	for(int i=0;i<n;i++){
		scanf("%s",&s.base[i].name);
		getchar();
		scanf("%c",&s.base[i].sex);

	}
	s.front=0;s.rear=n-1;
}

void OutQueue(SqQueue &s1,SqQueue &s2,int n1,int n2){//輸出配對人員的姓名
	printf("%s ",s1.base[s1.front].name);
	printf("%c  ",s1.base[s1.front].sex);
	printf("%s ",s2.base[s2.front].name);
	printf("%c",s2.base[s2.front].sex);
	putchar('\n');
	s1.front=(s1.front+1)%n1;
	s2.front=(s2.front+1)%n2;
}


void DancePartner(SqQueue &s1,SqQueue &s2,int t,int n1,int n2){//舞伴配對
	while(t){
		int i=1;
		printf("配對\n");
		while(s1.front!=s1.rear&&s2.front!=s2.rear){
			OutQueue(s1,s2,n1,n2);
		}

		if(s1.front==(s1.rear)){
			OutQueue(s1,s2,n1,n2);
					printf("第%d輪爲配對\n",i);
			printf("%s %c\n",s2.base[s2.front].name,s2.base[s2.front].sex);
		}
		else{
			if(s2.front==(s2.rear)){
				OutQueue(s1,s2,n1,n2);
						printf("第%d輪爲配對\n",i);
				printf("%s %c\n",s1.base[s1.front].name,s1.base[s1.front].sex);
			}
		}
		printf("===================\n");
		t--;
		i++;
	}
}

int main(){
	SqQueue s1,s2;
	int times,num1,num2;
	scanf("%d%d%d",&num1,&num2,×);
	Init_Queue(s1,num1);
	Init_Queue(s2,num2);
	DancePartner(s1,s2,times,num1,num2);
	return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章