简单的舞伴问题实现

西  

            (计算机学院)

 

数据结构课内实验报告

 

实验名称:         舞伴问题

 

 

 

 

 

 

 

    专业名称:      计算机科学与技术

   级:         计科1505

    学生姓名:            贺远

学号(8位):      04151154

指导教师:        初建玮、曾艳

实验日期:   201610211031

 

 

 

 

 

 

 

一. 实验目的

  1.通过对队列的学习,掌握队列的逻辑结构和存储结构,并实现舞伴问题。

  2.掌握队列的基本运算。

  3.通过应运队列知识,选择合适存储结构,编写算法实现舞伴问题,训练学生的分析和解决实际问题的能力。   

二. 实验内容

  1.[问题描述]   

     舞伴问题的描述:假设在周末舞会上,男士们和女士们进入舞厅时各自排成一队,跳舞开始时,依次从男队和女队的队头上各出一人配成舞伴,若两队初始人数不相同,则较长的那一队中未配对者等待下一轮舞曲。现要求设计一个函数模拟上述舞伴配对问题试设计程序实现之。

三. 实验方案设计

 1.分析  

    由于当男女排好队后,依次从男队和女队的队头上各出一人配成舞伴,剩下的人继续按顺序配对具有典型的先进先出特性,因此可以用队列作为算法的数据结构。在算法中应该先设置两个队列:mdancers(mp)wdancers(wp)分别存放男士和女士入队者。假设男士和女士的信息存放在一位数组中,作为输入,然后依次扫描该数组各元素,并根据性别来决定是进入男队还是女队。构造好两个队列后,依次将两队队头元素出队来匹配成舞伴,直至某队列变为空,此时若某队仍有待匹配者,输出等待者的名字。

2.采用的数据结构

   typedef struct

{

char name[20];

char sex;

}person;

typedef struct

{

person m[20];//存储名字和性别

int rear,front;

}mqueue;

3.算法实现

  ①整体结构

  main()

{

int num;//参与的男士与女士的总人数

person p[20];

mqueue *mp;//定义男士队列

mqueue *wp;//定义女士队列

mp=mdancers(mp);//男士队列初始化

    wp=mdancers(wp);//女士队列初始化

 printf(“请输入参与的男士与女士的总人数:“);

 scanf(“%d”,&num);

 if(num>20)  exit(1);

dencers(p,num,mp,wp);//匹配

}

 ②队列初始化

 mqueue *mdancers(mqueue *mp)//队列初始化

{

mp=malloc(sizeof(mqueue));//申请一段存储空间

mp->front=-1;//置空队

mp->rear=-1;

return mp;

}

③入队

Inmqueue(mqueue *mp,person p)//入队

{

if((mp->rear+1)%20==mp->front)

{

printf(“队满!“);

}

else

{

    mp->rear++;

    mp->m[mp->rear]=p;

}

}

④匹配

dencers(person p[20],int num,mqueue *mp,mqueue *wp)

   {

   int i;

   person q;

   printf(“请输入参与者的姓名,性别:”);

   getchar();

   for(i=0;i<num;i++)

   {

  scanf(“%s”,&p[i].name);

      scanf(“%s”,&p[i].sex);

   }

    for(i=0;i<num;i++)//将跳舞者依其性别入队

 {

    q=p[i];

if (q.sex==’m’) Inmqueue(mp,q);//排入男队

    if(q.sex==’f’) Inmqueue(wp,q);  //排入女队

 }

 printf(“匹配结果:\n”);

       while(!Emqueue(mp)&&!Emqueue(wp))//出队,输出下一个等待者的名字

   {

 

       mp->front++;

   q=mp->m[mp->front];

   printf(“%s  “,q.name );

  

           wp->front++;

   q=wp->m[wp->front];

   printf(“%s  \n”,q.name );

   }

  if(!Emqueue(mp))

  {

   mp->front++;

   q=mp->m[mp->front];

   printf(“下一个等待匹配的人是:%s \n”,q.name);

  }

      if(!Emqueue(wp))

  {

      wp->front++;

  q=wp->m[wp->front];

  printf(“下一个等待匹配的人是:%s \n”,q.name);

  }

 }

 

 

 

 

 

 

 

 

 

4.主要算法流程图

 

 

 

 

 

                                 Y            N

 

 

 

 

 

 

 

 

                         N                        Y

Y

 

                                             Y                    N

Y         N

                                                                 

 

YN

 

 

 

 

 

四. 该程序的功能和运行结果

1.  

 

 

2.

 

  

 

3.

 

 

五. 实验总结  

1.实验过程中遇到的问题及解决办法;

         刚开始对队列结构缺乏清楚的认识,对队列的操作不太熟练,导致绕了很多弯路,还有就是不了解计算机内部的存储,开始输入名字时为了方便,采用字符类型,结果输入时按空格键,导致结果总是出错,后来向同学咨询,在同学讲解之后明白了其中缘由,经过改正后程序得以正确运行。

2.实验方案的优点和缺点;

         优点是使用了顺序队列实现了舞伴问题,易于理解。

         缺点是只能匹配一首歌曲,不能进行循环。

3.对设计及调试过程的心得体会;

         从这次实验,我明白,要学好数据结构必须得亲自动手去编写算法,平时上课老师讲的还能听懂,感觉教材上的算法实例没什么好写的。可是经过本次实验我才发现自己的想法是多么的无知,就这次实验的题目,我看了一下觉得没什么难度,算法也挺简单,结果编写过程中还是出了许多问题。以后一定要加强动手编写,不能眼高手低。  

    原文作者:舞伴问题
    原文地址: https://blog.csdn.net/he__yuan/article/details/53153056
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞