题目描述
假设在周末舞会上,男士们和女士们进入舞厅时,各自排成一队。跳舞开始时,依次从男队和女队的队头上各出一人配成舞伴。若两队初始人数不相同,则较长的那一队中未配对者等待下一轮舞曲。要求编写程序实现舞伴问题。
输入
输入一共5行,第一行是男生人数m;第二行依次是男生的姓名;第三行是女士的人数n;第四行依次是女士的姓名;第五行是跳舞的轮数。
输出
配对的男士和女士的姓名。
样例输入
5
A B C D E
3
F G H
2
样例输出
B G
此题有点坑人
①学校oj上的“样例输入”,你如果点击黄色按钮“复制”,把数据粘贴到控制台,恭喜你,数据始终不正确。因为样例输入里,最后面多了几个空格和换行符,肉眼看不出来,天坑。
②getchar()比较多,一不小心数据出错
③输入数据时,除了输入字母,还输入空格。
比如
A B C D E
其实是五个字母,四个空格,一共九个数据
用C++的queue写起来要顺畅多了
#include<stdio.h>
#include<malloc.h>
typedef struct qnode//数据结点
{
char data;
struct qnode *next;
}DataNode;
typedef struct node//链队头结点
{
DataNode *Front;
DataNode *Rear;
}LinkQuNode;
void Init(LinkQuNode*&q)//初始化
{
q=(LinkQuNode*)malloc(sizeof(LinkQuNode));
q->Front=q->Rear=NULL;
}
bool Empty(LinkQuNode*q)
{
return (q->Rear==NULL);
}
void Push(LinkQuNode*&q,char e)
{
//步骤较多,不能少了哦
DataNode *p;
p=(DataNode*)malloc(sizeof(DataNode));//创建头结点
p->data=e;
p->next=NULL;
if(q->Rear==NULL)
{//若链队为空,则新节点既是队首节点又是队尾结点
q->Rear=q->Front=p;
}else//若链队不为空
{
q->Rear->next=p;
//将结点p链接到队尾,并将Rear指向它
q->Rear=p;
}
}
char Pop(LinkQuNode*&q)
{
DataNode*t;
char e;
if(q->Rear==NULL) return '0';//原来队列为空,则结束函数
t=q->Front;//t指向首结点
if(q->Rear==q->Front)//原来队列中只有一个数据结点时
{
q->Rear=q->Front=NULL;
}else//原来队列中有两个数据结点时
{
q->Front=q->Front->next;
}
e=t->data;
free(t);//删除结点
return e;
}
int main()
{
int n,m,times;
char ch,space;
LinkQuNode *Man,*Woman;
Init(Man);//别忘记初始化了哦
Init(Woman);
scanf("%d",&m);
getchar();//getchar()不能少了哦
for(int i=0;i<m;i++)
{
scanf("%c%c",&ch,&space);
Push(Man,ch);
}
scanf("%d",&n);
getchar();//getchar()不能少了哦
for(int i=0;i<n;i++)
{
scanf("%c%c",&ch,&space);
Push(Woman,ch);
}
char man,woman;
scanf("%d",×);
getchar();//getchar()不能少了哦
for(int i=1;i<=times;i++)
{
man=Pop(Man);//男性出队一个
woman=Pop(Woman);//女性出队一个
//啦啦啦,在跳舞
//跳舞结束
Push(Man,man);//跳舞完后,男生回男性队列
Push(Woman,woman);//跳舞完后,女生回女性队列
//到最后一轮,输出匹配的两个人
if(i==times)
{
printf("%c %c",man,woman);
}
}
}