c语言数据结构的舞会问题

问题:对于舞伴配对问题,先人队的男士或女士先出队配成舞伴,因此设置两个队列分别存放男士和女士人队者。假设男士和女士的记录存放在一个数组中作为输人,然后依次扫描该数组的各元素,并根据性别来决定是进入男队还是女队。当这两个队列构造完成之后,依次将两队当前的队头元素出队来配成舞伴,直至某队列变空为止。此时,若某队仍有等待配对者,则输出此队列中排在队头的等待者的姓名,此人将是下一轮舞曲开始时第一个可获得舞伴的人。
已经写了一部分,希望能办我修改和补充一下代码,以完善上面的功能


 
#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++混杂,代码修改如下:
运行结果:

img

代码:

#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); 
    }
}

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632