简单的舞伴问题实现

西  

            (计算机学院)

 

数据结构课内实验报告

 

实验名称:         舞伴问题

 

 

 

 

 

 

 

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

   级:         计科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.对设计及调试过程的心得体会;

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

### 回答1: 舞伴搭配问题是指在一群人中寻找舞伴,每个人都有自己的性别和舞伴偏好,目标是让每个人都找到自己喜欢的舞伴。 为了实现舞伴搭配问题的算法,我们可以使用 C 语言实现一个数据结构,来存储每个人的信息和配对情况。一个简单实现方式是使用结构体来存储每个人的信息,如下所示: ```c struct Person { char name[50]; // 姓名 char gender; // 性别,'M' 表示男性,'F' 表示女性 char preference[50]; // 舞伴偏好,如"Male" 或 "Female" struct Person *partner; // 指向舞伴的指针 }; ``` 然后,我们可以用一个数组来存储所有的人,如下所示: ```c struct Person people[100]; int num_people = 0; // 记录人数 ``` 接下来,我们需要实现一个函数来进行配对。一个简单实现方式是遍历每个人,如果某个人没有舞伴,就尝试为他/她找到一个舞伴。找舞伴的方式可以是遍历整个人群,找到一个符合条件的人进行配对。如果找到了合适的舞伴,就将两个人互相设置为舞伴。 ```c void find_partner() { for (int i = 0; i < num_people; i++) { struct Person *p1 = &people[i]; if (p1->partner == NULL) { for (int j = 0; j < num_people; j++) { struct Person *p2 = &people[j]; if (p1 != p2 && p2->partner == NULL && p1->gender != p2->gender && strcmp(p1->preference, p2->gender) == 0 && strcmp(p2->preference, p1->gender) == 0) { p1->partner = p2; p2->partner = p1; break; } } } } } ``` 在上面的代码中,我们使用了 strcmp 函数来比较字符串是否相等。这个函数可以用来比较舞伴偏好是否匹配。 最后,我们只需要调用 find_partner 函数即可完成舞伴搭配。 ### 回答2: 舞伴搭配问题是指在多对男女参加舞会时,如何进行舞伴搭配,使得每对男女舞伴之间的身高差最小。为了实现该问题,可以使用C语言中的数据结构来存储和处理相关信息。 首先,可以定义一个结构体来表示每个人的信息,包括姓名和身高。例如: ```c typedef struct{ char* name; int height; } Person; ``` 然后,可以创建一个包含所有人的数组,使用该结构体类型。例如: ```c Person people[MAX]; ``` 其中,MAX是参加舞会的总人数。 接下来,可以使用冒泡排序算法对所有人按照身高进行排序,从低到高或从高到低都可以。例如,按照从低到高的顺序排序: ```c for (int i = 0; i < MAX - 1; i++){ for (int j = 0; j < MAX - 1 - i; j++){ if (people[j].height > people[j+1].height){ Person temp = people[j]; people[j] = people[j+1]; people[j+1] = temp; } } } ``` 接下来,可以使用两个队列来存储男性和女性的舞伴搭配顺序,然后依次将排序后的人员按照性别分配到相应的队列中: ```c typedef struct{ Person people[MAX]; int rear; } Queue; Queue maleQueue, femaleQueue; maleQueue.rear = -1; femaleQueue.rear = -1; for (int i = 0; i < MAX; i++){ if (people[i].gender == 'M'){ maleQueue.rear++; maleQueue.people[maleQueue.rear] = people[i]; } else if (people[i].gender == 'F'){ femaleQueue.rear++; femaleQueue.people[femaleQueue.rear] = people[i]; } } ``` 最后,可以通过依次退队列的方式进行舞伴搭配,使得每对男女舞伴之间的身高差最小。例如: ```c for (int i = 0; i < MAX; i++){ printf("%s - %s\n", maleQueue.people[i].name, femaleQueue.people[i].name); } ``` 以上就是使用C语言实现舞伴搭配问题的简单例子。当然,该问题还可以通过其他数据结构和算法进行更高效的实现,比如使用堆来优化舞伴之间的身高差最小化。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值