实验项目三:队列的基本操作应用
截至:11月14日
课程名称:数据结构
实验目的:
1.掌握队列的定义及实现;
2.掌握利用队列的基本操作。
实验要求:
1、 使用链式结构完成队列的各种基本操作;
2、 补充完善教材81页的舞伴问题。
实验项目名称:队列的基本操作应用
实验过程:
1、 先建立一个舞者队列,依次往队列中添加人员信息(8个人,5男3女);
2、 分别创建男女队列;
扫描二维码关注公众号,回复:
9166947 查看本文章
3、 从舞者队列中依次将队首元素出队并判断其性别并添加至男队(5人)或女队(3人);
4、 分别从男队和女队出队队首元素并配对输出;(男队女队分别3人)
5、 将未完成的一队队首元素输出(男队的队首成员名称)。
实验结果:
输入:8人信息(A,B,C,D,E,F,G,H)
输出:The dancepartners:
A—B
C---D
E---F
G is waiting for a partner.
实验分析:
1.队列的操作特点;
2.列举调试运行过程中出现的错误并分析原因。
要求:
(1) 程序要添加适当的注释,程序的书写要采用缩进格式。
(2) 程序要具在一定的健壮性,即当输入数据非法时,程序也能适当地做出反应。
(3) 程序要做到界面友好,在程序运行时用户可以根据相应的提示信息进行操作。
(4) 上传源程序到课堂派。顺序表的源程序保存为dancepartner.cpp。
.
.
(丰富的代码注释)给个赞再走呗;
#include<stdio.h>
#include<string.h>
#include<malloc.h>
#include<stdlib.h>
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef int status;
#define MAXSIZE 100
typedef struct//保存舞者的个人信息
{
char name[20];
char sex;
}person;
typedef struct{
person *base;//存储空间的基地址
int front;//头指针
int rear;//尾指针
}queue;
queue Mdancers,Fdancers;
status initqueue(queue &q)//初始化一个队列
{
q.base=(person*)malloc(sizeof(person)*MAXSIZE);//给队列分配空间
if(!q.base) exit(OVERFLOW);//如果分配失败则结束函数返回错误
q.front=q.rear=0;//头指针和尾指针置为零,队列为空
return OK;
}
int queuelength(queue q){
return (q.rear-q.front+MAXSIZE)%MAXSIZE;//返回队列元素的个数,即队列的长度
}
status enqueue(queue &q,person e)//插入元素e为队列的新元素
{
if((q.rear+1)%MAXSIZE==q.front) return ERROR;//尾指针在循环意义上加1后等于头指针,表示队满
q.base[q.rear]=e;//新元素插入到队尾
q.rear=(q.rear+1)%MAXSIZE;//队尾指针加1
return OK;
}
status dequeue(queue &q,person &e)//删除队列队头元素,并且作为元素e返回
{
if(q.front==q.rear) return ERROR;//如果队列为空,则返回错误
e=q.base[q.front];//保存队头指针
q.front=(q.front+1)%MAXSIZE;//队头指针加1
return OK;
}
person gethead(queue q)//返回对头的元素,并且不修改队头指针
{
if(q.front!=q.rear)//队列非空
return q.base[q.front];//返回队头的元素,队头指针不变
}
status queueempty(queue q){
return(q.front==q.rear);//判断队列是否为空
}
void dancepartner(person dancer[],int num)//结构体数组dancer中存放跳舞的男女,num是跳舞的总人数
{ int i;
person p;
initqueue(Mdancers);//男队列初始化
initqueue(Fdancers);//女队列初始化
for(i=1;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);
}
}
void meue()//主操作菜单
{
int num,i;
person dancer[MAXSIZE];//构建保存舞者个人信息的结构体数组
printf("请输入总共有几位舞者:\n");
scanf("%d",&num);
for(i=1;i<=num;i++)
{
printf("请输入第%d位舞者的名字\n",i);
scanf("%s",&dancer[i].name);
printf("请输入第%d位舞者的性别\n",i);
scanf("%s",&dancer[i].sex);
}
dancepartner(dancer,num);
}
int main()
{
meue();
return 0;
}