求数据结构大神帮忙分析这段代码,每一段都是有什么作用,这是一个学生搭配的问题。

#include<stdio.h>
#include<malloc.h>

typedef struct Qnode
{
int data;
structQnode *next;
}Qnode,*Queueptr;
typedef struct
{
Queueptrfront;
Queueptrrear;
}Linkqueue;
void Initqueue(Linkqueue &Q)
{
Q.front=Q.rear=(Queueptr)malloc(sizeof(Qnode));
if(Q.front)
Q.front->next=NULL;
}

void Enqueue(Linkqueue&Q,int m)
{
Queueptr p;
p=(Queueptr)malloc(sizeof(Qnode));
if(p)
{
p->data=m;
p->next=NULL;
Q.rear->next=p;
Q.rear=p;
}
}
int Dequeue(Linkqueue &Q)
{
intm;
Queueptrp;
if(Q.rear!=Q.front)
{
p=Q.front->next;
m=p->data;
Q.front->next=p->next;
}
if(Q.front==p)
Q.rear=Q.front;
free(p);
returnm;
}

void Dance(Linkqueue M,LinkqueueW)
{
inti,m,n,k,a,b,c,d,num=0,r=0;
printf("请输入男生的数量:");
scanf("%d",&n);
printf("请输入女生的数量:");
scanf("%d",&m);
printf("请输入曲子的数量:");
scanf("%d",&k);
printf("请输入您要查找的男生编号:");
scanf("%d",&a);
printf("请输入您要查找的女生编号:");
scanf("%d",&b);
for(i=1;i<=m;i++)
Enqueue(W,i);
for(i=1;i<=n;i++)
Enqueue(M,i);
for(i=1;i<=k;i++)
{
printf("\n\n现在正在播放第%d首曲子!\n",i);
c=Dequeue(M);
d=Dequeue(W);
printf("现在正在跳舞的是第%d号男生和第%d号女生!\n",c,d);
if(c==a&&b==d)
{
r=1;
num++;
printf("第%d号男生和%d号女生在第%d号曲子一起跳舞!\n",a,b,i);
}
Enqueue(M,c);
Enqueue(W,d);
}
if(r==0)
printf("\n您要查找的%d号男生和%d号女生没有在一起搭配跳舞!\n",a,b);
if(r==1)
printf("\n您要查找的%d号男生和%d号女生一起跳舞的次数为:%d次!\n",a,b,num);
}

int main()
{
LinkqueueM,W;
printf("学生搭配问题!\n\n");
Initqueue(M);
Initqueue(W);
Dance(M,W);
return0;
}
原题是这样: 一班有m个女生,有n个男生(m不等于n),现要开一个舞会。男女生分别编号坐在舞池的两边的椅子上。每曲开始时,依次从男生和女生中各出一人配对跳舞, 本曲没成功配对者坐着等待下一曲找舞伴。
请设计一系统模拟动态地显示出上述过程,要求如下:
①输出每曲配对情况
②计算出任何一个男生(编号为X)和任意女生(编号为Y),在第K曲配对跳舞的情况.至少求出K的两个值。
③尽量设计出多种算法及程序,可视情况适当加分。

#include<stdio.h>
#include<malloc.h>
/*定义队列基本数据结构*/
typedef struct Qnode
{
    int  data;
    struct Qnode *next;
}Qnode,*Queueptr;
typedef struct
{
    Queueptr front;
    Queueptr rear;
}Linkqueue;
void Initqueue(Linkqueue &Q)//初始化队列
{
    Q.front=Q.rear=(Queueptr)malloc(sizeof(Qnode));
    if(Q.front)
       Q.front->next=NULL;
}
 
void Enqueue(Linkqueue&Q,int m)//入队
{
    Queueptr p;
    p=(Queueptr)malloc(sizeof(Qnode));
    if(p)
    {
       p->data=m;
       p->next=NULL;
       Q.rear->next=p;//在队尾入队(Q.rear)
       Q.rear=p;
    }
}
int Dequeue(Linkqueue &Q)//出队
{
    intm;
    Queueptrp;
    if(Q.rear!=Q.front)
    {
       p=Q.front->next;
       m=p->data;
       Q.front->next=p->next;//在队头出队(Q.front)
    }
    if(Q.front==p)
       Q.rear=Q.front;
    free(p);
    returnm;
}
 
void Dance(Linkqueue M,LinkqueueW)
{
    inti,m,n,k,a,b,c,d,num=0,r=0;
    printf("请输入男生的数量:");
    scanf("%d",&n);
    printf("请输入女生的数量:");
    scanf("%d",&m);
    printf("请输入曲子的数量:");
    scanf("%d",&k);
    printf("请输入您要查找的男生编号:");
    scanf("%d",&a);
    printf("请输入您要查找的女生编号:");
    scanf("%d",&b);
    for(i=1;i<=m;i++)
       Enqueue(W,i);//女生编号入队,从1到m
    for(i=1;i<=n;i++)
       Enqueue(M,i);//男生编号入队,从1到n
    for(i=1;i<=k;i++)
    {
       printf("\n\n现在正在播放第%d首曲子!\n",i);
       c=Dequeue(M);//男生队列出队
       d=Dequeue(W);//女生队列出队
       printf("现在正在跳舞的是第%d号男生和第%d号女生!\n",c,d);
       if(c==a&&b==d)//出队的男、女生编号和输入的编号匹配
       {
           r=1;
           num++;
           printf("第%d号男生和%d号女生在第%d号曲子一起跳舞!\n",a,b,i);
       }
       Enqueue(M,c);//c,d分别入队
       Enqueue(W,d);
    }
    if(r==0)
       printf("\n您要查找的%d号男生和%d号女生没有在一起搭配跳舞!\n",a,b);
    if(r==1)
       printf("\n您要查找的%d号男生和%d号女生一起跳舞的次数为:%d次!\n",a,b,num);
}
 
int main()
{
    LinkqueueM,W;
    printf("学生搭配问题!\n\n");
    Initqueue(M);
    Initqueue(W);
    Dance(M,W);
    return0;
}

给你加了一些注释,希望有帮助。望采纳

温馨提示:内容为网友见解,仅供参考
无其他回答

求大神帮忙分析一下这段代码有没有问题?为什么控制台打印不出main threa...
1.这不是一个多线程的类,TestThread应该继承Thread。2.要调用线程的start方法启动该线程。

找个JAVA高手帮忙分析下这段代码有什么问题,我在自学JAVA,现在写的这个...
有很多种可能哦,有可能是你的驱动有问题哦,你用的是2008还是2000还是2005,这些版本的驱动不同哦,还有在这里你没有用预处理,你为什么还要用preperStatement()这个方法呢,这样会降低效率的,没有预处理的时候还是用statement()吧

VB高手帮忙分析下 这段代码是干嘛的
咳咳,这不是vb代码!是批处理!!3389 >>典型病毒特征 net1 user root root \/add >>3389.txt 新建一个叫root的用户,密码为root net1 localgroup administrators root\/add >>3389.txt 把root用户添加到管理员组 清除痕迹 del 3389.txt del xiaonan.txt del %0 对注册表进行操作 REG ADD HKL...

电脑经常蓝屏 代码都不一样清大神帮忙分析下大概什么问题引起的~
1.首先说明下,此种情况一般是由于磁盘存在错误导致的,例如非法关机,或者硬盘正在读写时突然断电。但有时也建议检查硬盘连线是否接触不良, 或是没有使用合乎该硬盘传输规格的连接线, 例如ATA-100仍使用ATA-33的连接线, 对低速硬盘无所谓, 但告诉硬盘(支持ATA-66以上)的要求较严格, 规格不对的连线有...

请大神帮忙分析一下电路图有几个模块,有什么作用。
R23、R26是一个分压电路,应该是输入到单片机的AD端用于输入电压测量的,C5、C6作为输入滤波,MT3608、L1、D2、R24、R27一起组成DCDC升压电路,改变R24、R27这两个电阻分压值可以改变输出电压,C7、C8是输出电压滤波电路,RT1应该是自恢复保险丝,R21是分压电阻,可以减小AMS1117-5的输入电压,即降低...

...大侠帮帮忙,看看是不是硬盘或者其他硬件的问题,3Q
八、每次蓝屏的代码都不一样 这样的问题,基本上是硬件造成的,尤其以内存为第一个需要怀疑的对象,更换内存尝试,第二可能性是CPU虽然这东西不爱坏,可是从06年到现在我也遇到俩了,其他硬件基本上不会造成蓝屏代码随便变的情况。九、偶尔蓝屏,而且代码一闪而过重新启动的问题 这个是有有两种可能 1...

帮忙解析下这蓝屏代码是什么情况,谢谢!
◆错误分析:这个错误往往是虚拟内存中的内核数据无法读入内存造成的. 原因可能是虚拟内存页面文件中存在坏簇、病毒、磁盘控制器出错、内存有问题. ◇解决方案:首先用升级为最新病毒库杀毒软件查杀病毒, 如果促无信息中还有0xC000009C或0xC000016A代码, 那么表示是坏簇造成的, 并且系统的磁盘检测工具无法自动修复, ...

求各位大神帮忙分析一下这个星盘,跪谢! 本人女,95年2月2日7点整出生...
他们通常会有一张方形或圆形的脸蛋,爱吃垃圾食物,所以有时候会显得有点肥胖。 你的水星位於01宫【第01宫:自我意识、表达方式、外貌、人格及童年的成长环境】 水星在第一宫位的人对生命感到好奇,周遭的事很少能逃过他们的注意。他们的行动与自我表达都是立基於逻辑推理之上,而且他们通常都具有中上的智商。这些人...

请大家帮忙分析下这段话是什么意思? “希望所有的陪伴都是“…
大致意思是:不管四季如何变更,时间如何流逝,我们都是因为爱而长久的在一起,而不是为了在一起,就长久的忍耐和将就。

...显示这段东西 是什么原因导致蓝屏的?求大神们帮忙啊 谢谢!
蓝屏先看代码再找其他啊,或许只是简单的兼容问题或者驱动之类的小事呢。我就遇到过一种故障,每次蓝屏出来的代码都不一样,拆箱仔细检查,才发现是硬盘的固定螺钉松了一颗。总之导致蓝屏的原因很多,最简单的是先从代码查起,然后开想检查容易松动的配件,阁下所说的分析软件,其实我是连听都没听过的 ...

相似回答