问题:对于舞伴配对问题,先人队的男士或女士先出队配成舞伴,因此设置两个队列分别存放男士和女士人队者。假设男士和女士的记录存放在一个数组中作为输人,然后依次扫描该数组的各元素,并根据性别来决定是进入男队还是女队。当这两个队列构造完成之后,依次将两队当前的队头元素出队来配成舞伴,直至某队列变空为止。此时,若某队仍有等待配对者,则输出此队列中排在队头的等待者的姓名,此人将是下一轮舞曲开始时第一个可获得舞伴的人。
已经写了一部分,希望能办我修改和补充一下代码,以完善上面的功能
#include
#include
type struct
{
char name[20];
char sex;
}Person;
#define MAXQSIZE 100
typedef struct
{
Person *base;
int front;
int rear;
}SqQueue;
SqQueue Mdancers,Fdancers;
Status InitQueue(SqQueue &Q)
{
Q.base=new QElemType[MAXQSIZE];
if(!Q.base)
exit (OVERFLOW);
Q.front =Q.rear=0;
return OK
}
void DancePartner(Person dancer[],int num)
{
InitQueue(Mdancers);
InitQueue(Fdancers);
for(i=0;iif(p.sex=='F')
EnQueue(Fdancer,p);
else
EnQueue(Mdancers,p);
}
cout<<"the dancing partners are:\n;
while(!QueueEmpty(Fdancers)&&!QueueEmpty(Mdancers))
{
DeQueue(Fdancers,p);
cout<to get a partner is:"<
你这代码C和C++混杂,代码修改如下:
运行结果:
代码:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#define MAXQSIZE 100
typedef int Status;
#define OK 1
#define OVERFLOW -1
typedef struct
{
char name[20];
char sex;
}Person;
typedef struct
{
Person* base;
int front;
int rear;
}SqQueue;
SqQueue Mdancers, Fdancers;
Status InitQueue(SqQueue* Q)
{
Q->base = (Person*)malloc(sizeof(Person) * MAXQSIZE);
if (!Q->base)
return OVERFLOW;
Q->front = Q->rear = 0;
return OK;
}
//入队
Status EnQueue(SqQueue* Q, Person p)
{
if (Q->rear == MAXQSIZE - 1)
return OVERFLOW;
Q->base[Q->rear] = p;
Q->rear++;
return OK;
}
//出队
Status DeQueue(SqQueue* Q, Person* p)
{
if (Q->front == Q->rear)
return OVERFLOW;
*p = Q->base[Q->front];
Q->front++;
return OK;
}
//判断队列是否为空
int QueueEmpty(SqQueue Q)
{
if (Q.front == Q.rear)
return 1;
else
return 0;
}
//获取队列的第一个元素
Person GetTop(SqQueue Q)
{
Person p = Q.base[Q.front];
return p;
}
void DancePartner(Person dancer[], int num)
{
int i;
Person p;
InitQueue(&Mdancers);
InitQueue(&Fdancers);
for (i = 0; i < num; i++)
{
p = dancer[i];
if (p.sex == 'F')
EnQueue(&Fdancers, p);
else
EnQueue(&Mdancers, p);
}
printf("the dancing partners are:\n");
while (!QueueEmpty(Fdancers) && !QueueEmpty(Mdancers))
{
DeQueue(&Fdancers, &p);
printf("%s ", p.name);
DeQueue(&Mdancers, &p);
printf("%s\n", p.name);
}
if (!QueueEmpty(Fdancers))
{
p = GetTop(Fdancers);
printf("the first woman to get a partner is:%s\n", p.name);
}
if (!QueueEmpty(Mdancers))
{
p = GetTop(Mdancers);
printf("the first man to get a partner is:%s\n", p.name);
}
}
int main()
{
Person ps[] = { {"ZhangSan",'M'},{"LiLi",'F'},{"ZhaoQian",'F'},{"WangJuan",'F'},{"WangGang",'M'} };
DancePartner(ps, 5);
return 0;
}
https://blog.csdn.net/baidu_36669549/article/details/84555469
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 100 //队列可能达到的最大长度
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef int Status;
typedef struct{
char name [20]; //姓名
char sex; //性别,'F'表示女性,'M'表示男性
}Person;
typedef struct{
Person *base; //队列中数据元素类型为Person
int front; //头指针
int rear; //尾指针
}SqQueue;
Status InitQueue (SqQueue *Q);//构造一个空队列Q
Status EnQueue(SqQueue *Q, Person e);//插入元素e为Q的新的队尾元素
Status DeQueue(SqQueue *Q, Person *e);//删除Q的队头元素,用e返回其值
Person GetHead(SqQueue Q);//返回Q的队头元素,不修改队头指针
Status QueueEmpty(SqQueue Q);//判断队列是否为空,空则返回1
void DancePartner(Person dancer[],int num);//舞伴问题匹配算法
int main()
{
Person dancer[MAXSIZE];int i,num;
printf("请输入跳舞总人数:");
scanf("%d",&num);
printf("请输入各个跳舞人的姓名和性别('F'表示女性,'M'表示男性):\n");
for(i=0;i<num;i++)
{
printf("请输入第%d个跳舞人的姓名和性别(用空格隔开):",i+1);
scanf("%s %c",&dancer[i].name,&dancer[i].sex);
}
DancePartner(dancer,num);
return 0;
}
Status InitQueue (SqQueue *Q)
{//构造一个空队列Q
Q->base=(Person *)malloc(MAXSIZE*sizeof(Person));//为队列分配一个最大容量为MAXSIZE的数组空间
if(!Q->base) exit(OVERFLOW);//存储分配失败
Q->front=Q->rear=0;//头指针和尾指针置为零、队列为空
return OK;
}
Status EnQueue(SqQueue *Q, Person e)
{//插入元素e为Q的新的队尾元素
if ((Q->rear+1)%MAXSIZE==Q->front)//尾指针在循环意义上加1后等于头指针,表明队满
return ERROR;
Q->base[Q->rear]=e;//新元素插入队尾
Q->rear=(Q->rear+1)%MAXSIZE;//队尾指针加1
return OK;
}
Status DeQueue(SqQueue *Q, Person *e)
{//删除Q的队头元素,用e返回其值
if(Q->front==Q->rear) return ERROR; //队空
*e=Q->base[Q->front]; //保存队头元素
Q->front=(Q->front+1)%MAXSIZE; //队头指针加1
return OK;
}
Person GetHead(SqQueue Q)
{//返回Q的队头元素,不修改队头指针
if(Q.front!=Q.rear) //队列非空
return Q.base[Q.front]; //返回队头元素的值,队头指针不变
}
Status QueueEmpty(SqQueue Q)
{//判断队列是否为空
if(Q.front==Q.rear) return OK;//队列空,返回1
else return ERROR;//队列不空,返回0
}
void DancePartner(Person dancer[],int num)
{//结构数组dancer中存放跳舞的男女,num是跳舞的人数。
SqQueue Mdancers,Fdancers;
Person p;
int i;
InitQueue(&Mdancers); //男士队列初始化
InitQueue(&Fdancers); //女士队列初始化
for(i=0;i<num;i++) //依次将跳舞者根据其性别人队
{
p=dancer[i];
if (p.sex=='F') EnQueue(&Fdancers,p); //插入女队
else EnQueue(&Mdancers,p); //插人男队
}
printf("The dancing partners are:\n");
while(!QueueEmpty(Fdancers)&&!QueueEmpty(Mdancers))
{//依次输出男女舞伴的姓名
DeQueue(&Fdancers,&p); //女士出队
printf("%s ",p.name);; //输出出队女士姓名
DeQueue(&Mdancers,&p); //男士出队
printf("%s\n",p.name); //输出出队男士姓名
}
if (!QueueEmpty(Fdancers)) //女士队列非空,输出队头女士的姓名
{
p=GetHead(Fdancers); //取女士队头
printf("The first woman to get a partner is: %s\n", p.name);
}
else if (!QueueEmpty (Mdancers)) //男士队列非空,输出队头男士的姓名
{
p=GetHead(Mdancers); //取男士队头
printf("The first man to get a partner is: %s\n", p.name);
}
}
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!