主要实现代码


/****************************************************@Title: 数据结构实验@Name: <实验3-4> <循环队列> @Object:[实验目的] 循环队列的应用。[试验任务] 实现舞会上男女舞伴的自动匹配。舞会上先后到达男士和女士若干人,第一轮按照到来的先后顺序,男女搭配一组,如果有剩下的,等下一轮首先匹配。打印出1-3轮的匹配情况。 [实验提示] 1. 在文件 sqqueue.h 中完成循环队列的实现 2. 根据两个队列元素个数,如何计算能匹配多少对舞伴3. 前一轮尚未轮到的,在下一轮中先匹配,如何处理,要完成多轮匹配。提示:匹配后继续加入队列中。 @Files:app0304.cpp [*]测试循环队列的主程序 sqqueue.h [*]循环队列的实现 dance.txt [*]舞伴数据文件 @Usage:请查看"TO-DO列表",根据要求完成代码@Copyright: BTC 2004, Zhuang Bo@Author: Zhuang Bo@Date: 2004@Description:
*****************************************************/#include <stdio.h>
#include <stdlib.h>
#include<string.h>
struct Person {char name[20]; //名字 char sex;      //男'M';女'F'
};#define ElemType Person /* 队列中数据元素的类型 */
#include "sqqueue.h"////////////////////////////////////////////
//主程序
void du();
void pipei();
SqQueue maleDancers, femaleDancers;
void main()
{InitQueue(maleDancers);InitQueue(femaleDancers);//用两个队列存放男士和女士//从文件dance.txt中读取数据//匹配舞伴//计算并打印出1-3轮的匹配结果 for(int round=0; round<3; round++) {/* TODO (#1#): 计算并打印第round轮匹配结果 */du();pipei();//------------------------------------------}system("pause"); //暂停
}
void du(){FILE *fin=0;if((fin=fopen("dance.txt","r"))==0) {printf("错误: 不能打开文件 dance.txt\n"); exit(1);}while(!feof(fin)) {//读出一条记录 Person p;p.sex = fgetc(fin);fgets(p.name, 20, fin);//printf("%c",p.sex);/* TODO (#1#): 根据性别将 p 加入对应的队列 */if(p.sex=='F'){EnQueue(femaleDancers, p);}else{EnQueue(maleDancers, p);}//------------------------------------------}}
void pipei(){Person p1,p2;int npair; //一轮中匹配舞伴数(对)/* TODO (#2#): 计算能够匹配多少对舞伴 */for(npair=0;(!QueueEmpty(femaleDancers))&&(!QueueEmpty(maleDancers));npair++){GetHead(femaleDancers, p1);GetHead(maleDancers, p2);printf("匹配成功,男:%s 女:%s\n",p2.name,p1.name);DeQueue(femaleDancers, p1);DeQueue(maleDancers, p2);}printf("第一匹配数%d\n",npair);printf("匹配结束");// npair = -------------------------------------}////////////////////////////////////////////
//函数的定义 

/*Name: 循环队列 Copyright: BTC 2004Author: Zhuang BoDate: 2004Description:[Include] ds.h[Constants]MAXQSIZE[Types]ElemTypeSqQueue[Functions]InitQueue(&Q)DestroyQueue(&Q)ClearQueue(&Q)QueueEmpty(Q)QueueLength(Q)GetHead(Q,&e)EnQueue(&Q,e)DeQueue(&Q,&e)[For Debug]PrintElem(ElemType e)QueueView(Q)
*/#ifndef SQQUEUE_H_INCLUDED
#define SQQUEUE_H_INCLUDED /* 防止重复包含 *///////////////////////////////////////////
//包含头文件
#include <stdlib.h>
#include "ds.h" // OK, Status 等定义 //数据元素的类型(缺省使用int型)
#ifndef ElemType
#define ElemType int
#define USE_DEFAULT_ELEMTYPE /* 使用缺省类型的标志 */
#endif //ElemType//////////////////////////////////////////
//循环队列的存储结构#define MAXQSIZE 64 /* 循环队列的最大容量 */
typedef struct {/* TODO (#1#): 这里完成循环队列的类型定义 */ElemType *base;int front;int rear;//....................................
} SqQueue;//////////////////////////////////////////
//循环队列的基本操作 //构造一个空队列Q
Status InitQueue(SqQueue &Q)
{/* TODO (#2#): 构造空队列 */Q.base=(ElemType*)malloc(MAXQSIZE*sizeof(ElemType));if(!Q.base){exit(0);}Q.front=Q.rear=0;return OK; //TODO: 替换这行代码,以下同//....................................
}//销毁队列Q
//  前提:队列Q已存在
Status DestroyQueue(SqQueue &Q)
{/* TODO (#3#): 销毁队列 */if(Q.base){free(Q.base);return OK;}elsereturn ERROR;//....................................
}//将队列Q清为空队列
//  前提:队列Q已存在
Status ClearQueue(SqQueue &Q)
{/* TODO (#4#): 清空队列 */if(Q.base){Q.front=Q.rear;return  OK;}elsereturn ERROR;//....................................
}//若队列Q为空,则返回TRUE,否则FALSE
//  前提:队列Q已存在
Status QueueEmpty(SqQueue Q)
{/* TODO (#5#): 判断队列是否为空 */if(Q.rear==Q.front){return TRUE; }return FALSE;//....................................
}//返回队列Q的元素个数,即队列长度
//  前提:队列Q已存在
int QueueLength(SqQueue Q)
{/* TODO (#6#): 返回队列长度 */return (Q.rear-Q.front+MAXQSIZE)%MAXQSIZE;//....................................
}//取队列Q头元素用e返回
//  前提:队列Q存在且非空
Status GetHead(SqQueue Q, ElemType &e)
{/* TODO (#7#): 取队头元素存入e */if(Q.front==Q.rear){//队列为空return ERROR;      }e=Q.base[Q.front];return OK;//返回操作状态(成功:OK,失败:ERROR)//....................................
}//插入元素e作为队列Q的新的队尾元素
//  前提:队列Q存在且未满
Status EnQueue(SqQueue &Q, ElemType e)
{/* TODO (#8#): 元素e入队列 */if((Q.rear+1)%MAXQSIZE==Q.front){return ERROR;}Q.base[Q.rear]=e;Q.rear=(Q.rear+1)%MAXQSIZE;return OK;//返回操作状态(成功:OK,失败:ERROR)//....................................
}//删除队列Q的队头元素,并用e返回
//  前提:队列Q存在且非空
Status DeQueue(SqQueue &Q, ElemType &e)
{/* TODO (#9#): 出队列存入e */if(Q.front==Q.rear){return ERROR;}e=Q.base[Q.front];Q.front=(Q.front+1)%MAXQSIZE;return OK ;//返回操作状态(成功:OK,失败:ERROR)//....................................
}////////////////////////////////////////////TODO: 定义好 SqQueue 类型后使用 QueueView 函数 #include <stdio.h>
//查看队列状态(调试用)
void QueueView(SqQueue Q)
{//extern void PrintElem(ElemType e);//打印数据用 int i=0;if(Q.front<0||Q.front>=MAXQSIZE||Q.rear<0||Q.rear>=MAXQSIZE){printf("队列未初始化\n"); return ;}printf("---Queue View---\n");printf("front=%d , rear=%d\n", Q.front, Q.rear);if(Q.rear>=Q.front) {printf(".....   ......\n");for(i=Q.front; i<Q.rear; i++) {printf("%5d\t", i);printf("%d",Q.base[i]);printf("\n");}if(i<MAXQSIZE) printf(".....   ......\n");} else {       for(i=0; i<Q.rear; i++) {printf("%5d\t", i);printf("%d",Q.base[i]);printf("\n");}printf(".....   ......\n");for(i=Q.front; i<MAXQSIZE; i++) {printf("%5d\t", i);printf("%d",Q.base[i]);printf("\n");}}printf("--- view end ---\n");
}//取消ElemType的默认定义,以免影响其它部分
#ifdef USE_DEFAULT_ELEMTYPE
#undef ElemType
#undef USE_EFAULT_ELEMTYPE
#endif#endif //SQQUEUE_H_INCLUDED
/*Name: 类C通用模块 Copyright: BTC 2004Author: Zhuang BoDate: 2004Description:  [Constants]TRUE/FALSE/OK/ERROR/INFEASIBLE/OVERFLOW      [Types]  Status      [Functions]max(a,b)min(a,b)read(char/int/float/double/char*)write(char/int/float/double/char*)
*/#ifndef _DS_H_
#define _DS_H_// 函数结果状态代码
const int TRUE      = 1;
const int FALSE     = 0;
const int OK        = 1;
const int ERROR     = 0;
const int INFEASIBLE    = -1;
const int OVERFLOW      = -2;// Status 是函数的类型,其值是函数结果状态代码
typedef int Status;//基本函数
#define max(a,b) (((a)<(b))?(b):(a))
#define min(a,b) (((a)<(b))?(a):(b))#include <stdio.h>
//不用格式串的输入输出(目的是为了方便书写算法)
//    比如输入一个基本类型(char, int, float, double, char*)的
//    变量 x,可以直接用 read(x);输入,而打印则用 write(x);。
//    对于自定义类型,可以继续扩充。
inline void read(char& e)     { e = getchar(); }
inline void read(int& e)      { scanf("%d", &e); }
inline void read(float& e)    { scanf("%f", &e); }
inline void read(double& e)   { scanf("%lf", &e); }
inline void read(char *e)     { gets(e); }
inline void write(char e)     { printf("%c", e); }
inline void write(int e)      { printf("%d", e); }
inline void write(float e)    { printf("%f", e); }
inline void write(double e)   { printf("%lf", e); }
inline void write(char *e)    { printf("%s",e); }#endif  // _DS_H_

演示效果:

实现舞会上男女舞伴的自动匹配。相关推荐

  1. 图片裁切,上传,自动匹配颜色。

    图片裁切,上传,自动匹配颜色. photoclip插件学习. https://github.com/baijunjie/PhotoClip.js是官方文档. 使用方法很简单.不过我在使用的过程中遇到几 ...

  2. 第四章 舞会上的国王

    1.1.0版本闪亮登场 1.0版的诞生也意味着linux有了新的需要:公关关系和广告宣传.而我,只是像推出此前的那些版本一样略微的有些兴奋.我倒愿意在讨论组上写些东西,比如:"1.0版问世, ...

  3. EXCEL中数据的自动匹配主要包含的内容

    EXCEL中数据的自动匹配主要包含的内容: EXCEL中无法直接使用SELECT语句进行数据查询.定位.匹配,必须依赖其自身提供的函数.本文将介绍三种EXCEL中的数据自动匹配方法,使单元格内容能够自 ...

  4. linux嵌套字幕工具,Linux(NAS通用)下自动匹配射手字幕脚本

    2014/02/17更新:加入因超时致使获取字幕不成功的情况. 2014/02/15更新:优化了脚本,充分考虑获取字幕失败后的情况,保证在下次运行时还能再次获取上次失败的字幕. 从头学起,用了一天的时 ...

  5. mysql中的merge into,SQL Server 2008中利用merge into关键实现insert/update自动匹配(类似于MySQL中的For Update关键字)...

    SQL Server 2008中利用merge into关键实现insert/update自动匹配(类似于MySQL中的For Update关键字) 语法请参考: 按照语法编写语句 DECLARE @ ...

  6. 【汇编语言】数据类型的匹配问题:自动匹配与手动匹配

    0 前言 本文基于8086汇编语言,不过x86系列语言具备向下兼容特点,大多数情况都可以用. 与高级语言数据类型的自动转换和强制转换一样,汇编语言的数据类型也有 自动匹配和手动匹配. 下面,我来介绍一 ...

  7. Python Socket联机自动匹配双人五子棋(含登录注册系统与界面,数据库连接,可作结课作业,可用于学习)

    1.前言 首先,关于源码的获取,本人提供了三种方式: 直接从文章里面Ctrl+C,Ctrl+V,然后按照我已给的文件结构搞一下即可: 通过积分下载上传到CSDN的资源: 点开本人的主页,点击" ...

  8. mac mail 删除邮件服务器,这是在Mac上的Mail中自动删除垃圾电子邮件的方法

    有关于这是在Mac上的Mail中自动删除垃圾电子邮件的方法现在一些变化大家兴趣很大,既然要对这是在Mac上的Mail中自动删除垃圾电子邮件的方法了解清楚,小编特地给大家带来具体情况. 随着时间的推移, ...

  9. 用python的tkinter做游戏(八)—— 实现图片在tkinter中自适应大小(自动匹配窗口)

    用python的tkinter做游戏 系列: 用python自带的tkinter做游戏(一)-- 贪吃蛇 篇 用python自带的tkinter做游戏(二)-- 俄罗斯方块 篇 用python自带的t ...

最新文章

  1. Python,OpenCV基于支持向量机SVM的手写数字OCR
  2. 【C#串口编程计划】C#串口协议解析 -- 文本数据
  3. 创新实训个人记录:approximation factor, maximum matchingvertex cover
  4. Linux之vim的使用
  5. 【Python基础知识-pycharm版】第八节-面向对象编程/类
  6. POJ 1741 Tree 树分治
  7. ACL2022奇葩标题大赏
  8. Python socket编程模拟最简单的HTTP响应
  9. VB连接ACCESS数据库精简版
  10. (面试总结)您不清楚的18个非技术面试题---今天教你巧妙回答
  11. 超级搜索术4-学业有成/职场晋升
  12. 在线考试系统软件测试总结,基于智慧校园平台的在线考试系统应用研究
  13. Pycharm中Python环境配置
  14. RTMP推流摄像机联合EasyCVR安防视频云服务平台助力智能楼宇的建设
  15. Html5和Css3的基础标签及常用属性
  16. VS2017 创建安装项目模板
  17. 计算机word考试试题学做,全国计算机等级考试Word试题及答案
  18. UG/NX二次开发-阿飞博客专栏目录(九块九抄代码)
  19. 【JY|土木】失稳你过来,我们谈谈吧。
  20. 网易视频云:浅谈视频通信技术的发展

热门文章

  1. 计算机学院新增电子信息!齐鲁工业大学
  2. error: (-215:Assertion failed)解决方案
  3. Tanzu系列:第8部分 - 创建tkg集群
  4. 用电脑怎么打开pdf文件阅读
  5. 游戏耳机怎么选购?适合玩游戏的无线蓝牙耳机品牌
  6. php怎么定义字符串变量的值,php字符串变量怎么替换
  7. Bilibili网站后台代码泄露,从注释看到的一些感想。
  8. OCR:通用数码管图像识别训练和使用
  9. 中国三大主流开源Linux操作系统社区及其产品生态
  10. 建模计算机处理器,实战建模渲染,用锐龙7 5800X拒绝拖稿