许瑾恩 发表于 2014-12-15 16:29:03

舞伴问题

假定在一舞会上,男士排成一队,女士排成一队。
跳舞开始时,依次从男队和女队的队头各出一人配成舞伴。
若两队初始人数不相同,则较长的那一队中未配对者等待下一轮舞曲。
[基本要求]
模拟上述舞伴系统,并能计算对于任何男士A和女士B在哪一轮舞曲中的k次跳舞。
[实现提示]
用循环队列实现上述操作*/


#include <stdio.h>
#include <malloc.h>
#define MAX 7
typedef int elemtype;
typedef struct
{
        elemtype data;
        int front, rear;
        int num;//人数
}sequeue;
typedef struct
{
        int turn;
    intorder;
}partner;
void addqueue();   //入队
elemtype outqueue(); //出队
elemtype getqueue(); //读取队头
void play();         //配对输出情况
void search();       //配对查找情况
void inqueue();      //男女入队
void menu();
sequeue *man,*woman;
partner dance;

main()
{   
        char ch;
        inqueue();
        play();
        printf("\n按任意键查找男女士配对情况,按 @ 号建结束 \n");
        scanf("%s",&ch);
        getchar();

        while(ch != '@')
        {
                search();
          printf("\n按任意键查找男女士配对情况,按 @ 号建结束\n");
            scanf("%s",&ch);
                getchar();
        }
}

void addqueue(sequeue *q,int x)
{
        if((q->rear+1)%MAX==q->front)
                printf("队满\n");
        else
        {
                q->rear=(q->rear+1)%MAX;
                q->data=x;
        }
}

int outqueue(sequeue *q)
{
        if(q->rear==q->front)
                return 0;
        else
        {
                q->front=(q->front+1)%MAX;
                addqueue(q,q->data);
                return q->data;
        }
}

void inqueue()
{
        int i;
        //sequeue *man,*woman;
        man=(sequeue *)malloc(sizeof(sequeue));
        woman=(sequeue *)malloc(sizeof(sequeue));
        printf("请输入男士和女士的人数:");
        scanf("%d%d",&man->num,&woman->num);
        while(man->num>MAX || woman->num>MAX)
        {
                printf("\n输入数目过大,请重新输入!\n\n请输入男士和女士的人数:");
      scanf("%d%d",&man->num,&woman->num);
        }
        for(i=1;i<=man->num;i++)
                addqueue(man,i);
        for(i=1;i<=woman->num;i++)
                addqueue(woman,i);
}

void play()
{   
//        sequeue *man;
//        sequeue *woman;
//        partner p;
        int m,w,i,j;
        m=outqueue(man);//男士首次出队
        w=outqueue(woman);//女士首次出队
        i=1;
        j=1;
        dance.turn=i;   //第一轮
        dance.order=j; //第一次
        printf("%d\t%d\n",m,w);
        while(m<man->num || w<woman->num)
        {
                m=outqueue(man);
          w=outqueue(woman);
                j=j+1;
                dance.turn=i;
                dance.order=j;
            printf("%d\t%d\n",m,w);
            if(man->num <= woman->num && m==man->num)
                {
                        printf("男士人数已排完,第%d个曲目的舞蹈结束 !\n",i);
                        i=i+1;
                        j=0;
                }
                if(man->num > woman->num && w==woman->num)
                {
                        printf("女士人数已排完,第%d个曲目的舞蹈结束 !\n",i);
                        i=i+1;
            dance.turn=i;
                        j=0;
                }
        }
        printf("\n搭配完成 !\n");
}

void search()
{
        int m,w;
        printf("\n请输入待查找的男女序号--");
        scanf("%d%d",&m,&w);
        if(dance.turn==0)
                printf("\n该男士与该女士没有搭配曲目!\n");
        else
                printf("\n*****第 %d 号男士和第 %d 号女士在第 %d 轮曲目第 %d 次入场!*****\n",m,w,dance.turn,dance.order);
}

感觉还有些小缺陷,哪位大神能帮我改进改进,谢谢



页: [1]
查看完整版本: 舞伴问题