《数据结构:病人看病程序的模拟》由会员分享,可在线阅读,更多相关《数据结构:病人看病程序的模拟(8页珍藏版)》请在金锄头文库上搜索。
1、实验二:病人看病模拟程序一、 实验目的1、 掌握单链队列存储方式的类型定义,掌握单链队列的基本运算的实现。2、 学会根据应用问题的需要选择合适的数据结构,掌握队列的先进先出运算规则及其在病人看病模拟程序中的应用,理解队列在运算过程中状态的变化。二、 实验内容编写一个程序,反映病人到医院看病排队看医生的情况。三、 需求分析1、 运行环境:Windows操作环境, Visual C+6.02、 程序应该达到的功能:在 病 人 排 队 过 程 中 , 主 要 重 复 两 件 事 :( 1) 病 人 到 达 就 诊 室 , 将 病 历 交 给 护 士 , 排 到 等 待 队 列 中 候 诊 。( 2)
2、 护 士 从 等 待 队 列 中 取 出 下 一 位 病 人 的 病 历 , 该 病 人 进 入 入 诊 室 就 诊 。要 求 模 拟 病 人 等 待 就 诊 这 一 过 程 。 程 序 采 用 菜 单 方 式 , 其 选 项 及 功 能 说 民 如 下 :( 1) 排 队 输 入 排 队 病 人 的 病 历 号 , 加 入 到 病 人 排 队 队 列 中 。( 2) 就 诊 病 人 排 队 队 列 中 最 前 面 的 病 人 就 诊 , 并 将 其 从 队 列 中 删 除 。( 3) 查 看 排 队 从 队 首 到 队 尾 列 出 所 有 的 排 队 病 人 的 病 历 号 。( 4) 不
3、再 排 队 , 余 下 依 次 就 诊 从 队 首 到 队 尾 列 出 所 有 的 排 队 病 人 的 病 历号 , 并 退 出 运 行 。( 5) 下 班 退 出 运 行 。四、 概要设计1、 数据结构的选择考 虑 到 病 人 排 队 候 诊 的 过 程 中 具 有 先 排 队 就 诊 的 特 诊 , 与 队 列 的 先 进 先 出 的 特 征相 吻 合 , 因 此 可 以 考 虑 采 用 队 列 线 性 表 , 其 中 , 队 列 的 存 储 结 构 有 循 环 顺 序 队 列 和 单链 队 列 。 考 虑 到 循 环 顺 序 队 列 的 插 入 , 删 除 浪 费 空 间 和 时 间 ,
4、 故 采 用 单 链 队 列 , 而 建立 带 头 结 点 的 单 链 队 列 比 无 头 结 点 的 单 链 队 列 更 简 化 了 插 入 和 删 除 操 作 , 因 此 采 用 带头 结 点 的 单 链 队 列 。2、 程序的总体结构( 1) 建 立 名 为 “proj3_6”的 项 目 文 件 , 在 该 项 目 的 管 理 下 完 成 本 程 序 开 发 。 在 该项 目 下 建 立 名 为 “exp3_6.cpp”的 源 程 序 文 件 , 文 件 中 主 要 包 括 main()和 SeeDoctor()两 个 函 数 , 它 们 的 关 系 如 图 1(b)所 示 。 图 1(
5、 a) 图 1( b)( 2) 程 序 的 主 要 功 能 在 SeeDoctot()函 数 中 实 现 , main()函 数 起 到 调 用 SeeDoctor()函数 的 作 用 。五、 详细设计1、 数据结构的类型定义:(1) 链队结点的类型定义typedef struct qnodeint data;struct qnode *next; QNode;(2) 链队的整体结构定义qu-rearqu-front 1 2 3(3) 链队的整体结构图示qu-rearqu-frontmainSeeDoctorexp3_6.cpp 文件2、 main()函数:void main()seeDoct
6、or();3、 SeeDoctor()函数:模拟病人看病的过程。病人排队看医生,所以要用到一个队列,这里设计了一个带头结点的单链表作为队列。六、 测试数据及测试结果 void SeeDoctor()int sel,flag=1,find,no; /flag 的初始值为 1,一旦下班-退出系统,则将其置为 0,从而结束QuType *qu;QNode *p;qu=(QuType*)malloc(sizeof(QuType);qu-front=qu-rear=(QNode*)malloc(sizeof(QNode);qu-front-next=NULL;while(flag=1) printf(1
7、:排队 2:就诊 3:查看排队 4:不再排队,余下依次就诊 5:下班 请选择);scanf(%d,&sel);switch(sel)case 1:完成排队功能;case 2:完成就诊功能;case 3:完成查看排队功能;case 4:完成不再排队,余下依次就诊功能 ;case 5:完成下班 请选择 功能; 各分支设计如下: 分支 1:排队输入排队病人的病历号,加入到病人排队队列中。先检查将要排队病人的病历号是否已经在队列中,若在,则病历号重复,不能完成排队功能,需重新输入;若不在,将其入队。为此,设计一个 do-while 语句来判断病历号是否存在队列中,其循环条件:find=1;首先输入病历
8、号,若在,则 find=1,继续循环;若不在,find=0,跳出循环,将其入队。检查将要入队病人的病历号是否存在的关键代码如下:case 1: printf( 输入病历号);doscanf(%d,&no);find=0;p=qu-front; while(p!=NULL&!find)if(p-data=no)find=1;elsep=p-next;if(find)printf( 输入的病历号重复,重新输入:);while(find=1); /直到输入一个不在队列中的病号才结束循环p=(QNode*)malloc(sizeof(QNode); /创建结点p-data=no;p-next=NULL
9、;qu-rear-next=p; qu-rear=p; /将*p 结点入队 break; 分支 2:就诊病人排队队列中最前面的病人就诊,并将其从队列中删除。利用 if 语句来判断队列是否为空,若空,则输出“没有排队的病人!”;若不空,则输出“病人%d 就诊” ,最后删除病人 %d。病人就诊关键代码如下:case 2: if (qu-front-next=NULL) /*队空*/printf( 没有排队的病人!n);else /*队不空*/p=qu-front-next;printf( 病人%d 就诊n,p-data);qu-front-next=p-next;free(p);break; 分支
10、 3:查看排队从队首到队尾列出所有的排队病人的病历号。先利用 if 判断队列是否为空,若空,则输出“没有排队的病人!”;若不空,则利用 while 循环来依次输出从队首到队尾所有排队病人的病历号。查看排队关键代码如下:case 3:if(qu-front-next=NULL)printf( 没有排队的病人); /队空else /队不空 p=qu-front-next;printf( 排队病人);while(p!=NULL) printf(%d,p-data);p=p-next;printf(n);break; 分支 4:不再排队,余下依次就诊从队首到队尾列出所有的排队病人的病历号,并退出运行。
11、先用 if 判断队列是否为空,若空,则输出“没有排队的病人!” ,find=0,退出循环;若不空,则利用 while 循环来列出从队首到队尾的所有排队病人的病历号,find=0,退出循环。不再排队,余下依次就诊关键代码如下:case 4: if(qu-front-next=NULL) /队空 printf( 没有排队的病人);else /队不空 p=qu-front-next;while(p!=NULL)printf(%d,p-data);p=p-next;printf(n);flag=0;break; 分支 5:下班退出循环。若队不空,则输出“余下排队病人请明天就医!” ,并将 find=0
12、,退出循环。下班的关键代码如下:case 5: if(qu-front-next!=NULL) /队不空 printf( 请排队的病人明天就医!);flag=0; /*退出 */break;测试结果:七、 使用说明在 Visual C+6.0 环境下,按下述步骤操作即可:“文件”菜单/打开 工作区/选择proj3_6.dsw”,确定/ “编译”菜单/ 执行 exp3_6.exe。八、 心得体会九、 源程序清单/*文件名:exp3-6.cpp*/#include#includetypedef struct qnodeint data;struct qnode *next;QNode; /*链队结
13、点类型*/typedef structQNode *front,*rear;QuType; /*链队类型*/ void seeDoctor()int sel,flag=1,find,no;QuType *qu;QNode *p;qu=(QuType*)malloc(sizeof(QuType); /创建队列qu-front=qu-rear=(QNode*)malloc(sizeof(QNode);/创建头结点qu-front-next=NULL; /队列为空while(flag=1) /*循环执行*/ printf(1:排队 2:就诊 3:查看排队 4:不再排队,余下依次就诊 5:下班 请选择
14、);scanf(%d,&sel);switch(sel) case 1: printf( 输入病历号);doscanf(%d,&no);find=0;p=qu-front;while(p!=NULL&!find)if(p-data=no)find=1;elsep=p-next;if(find)printf( 输入的病历号重复,重新输入:);while(find=1);/直到输入一个不在队列中的病号才结束循环p=(QNode*)malloc(sizeof(QNode); /创建结点p-data=no;p-next=NULL;qu-rear-next=p;qu-rear=p; /将*p 结点入队break;case 2: if (qu-front-next=NULL) /*队空*/printf( 没有排队的病人!n);else /*队不空*/p=qu-front-next;printf( 病人%d 就诊n,p-data);qu-front-next=p-next;free(p);break;case 3:if(qu-front-next=NULL) /队空printf( 没有排队的病人!n);else /