数据结构:病人看病程序的模拟

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验二:病人看病模拟程序
一、实验目的
1、掌握单链队列存储方式的类型定义,掌握单链队列的基本运算的实现。

2、学会根据应用问题的需要选择合适的数据结构,掌握队列的先进先出运算规则及其在病
人看病模拟程序中的应用,理解队列在运算过程中状态的变化。

二、实验内容
编写一个程序,反映病人到医院看病排队看医生的情况。

三、需求分析
1、运行环境:Windows操作环境,Visual C++6.0
2、程序应该达到的功能:
在病人排队过程中,主要重复两件事:
(1)病人到达就诊室,将病历交给护士,排到等待队列中候诊。

(2)护士从等待队列中取出下一位病人的病历,该病人进入入诊室就诊。

要求模拟病人等待就诊这一过程。

程序采用菜单方式,其选项及功能说民如下:(1)排队——输入排队病人的病历号,加入到病人排队队列中。

(2)就诊——病人排队队列中最前面的病人就诊,并将其从队列中删除。

(3)查看排队——从队首到队尾列出所有的排队病人的病历号。

(4)不再排队,余下依次就诊——从队首到队尾列出所有的排队病人的病历号,并退出运行。

(5)下班——退出运行。

四、概要设计
1、数据结构的选择
考虑到病人排队候诊的过程中具有先排队就诊的特诊,与队列的先进先出的特征相吻合,因此可以考虑采用队列线性表,其中,队列的存储结构有循环顺序队列和单链队列。

考虑到循环顺序队列的插入,删除浪费空间和时间,故采用单链队列,而建立带头结点的单链队列比无头结点的单链队列更简化了插入和删除操作,因此采用带头结点的单链队列。

2、程序的总体结构
(1)建立名为“proj3_6”的项目文件,在该项目的管理下完成本程序开发。

在该项目下建立名为“exp3_6.cpp”的源程序文件,文件中主要包括main()和SeeDoctor()两个函数,它们的关系如图1(b)所示。

图1(a)图1(b)
(2)程序的主要功能在SeeDoctot()函数中实现,main()函数起到调用SeeDoctor()函数的作用。

五、详细设计
1、数据结构的类型定义:
(1)链队结点的类型定义
typedef struct qnode
{
int data;
struct qnode *next;
} QNode;
(2)链队的整体结构定义
(3)链队的整体结构图示
2、main()函数:
void main()
{
seeDoctor();
}
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:排队2:就诊3:查看排队4:不再排队,余下依次就诊5:下班请选择");
scanf("%d",&sel);
switch(sel)
{case 1:完成排队功能;
case 2:完成就诊功能;
case 3:完成查看排队功能;
case 4:完成不再排队,余下依次就诊功能;
case 5:完成下班请选择功能;
}
}
●各分支设计如下:
分支1:排队——输入排队病人的病历号,加入到病人排队队列中。

先检查将要排队病人的病历号是否已经在队列中,若在,则病历号重复,不能
完成排队功能,需重新输入;若不在,将其入队。

为此,设计一个do-while语句来判断病历号是否存在队列中,其循环条件:
find==1;首先输入病历号,若在,则find=1,继续循环;若不在,find=0,跳
出循环,将其入队。

检查将要入队病人的病历号是否存在的关键代码如下:
case 1: printf(" >>输入病历号");
do
{
scanf("%d",&no);
find=0;
p=qu->front;
while(p!=NULL&&!find)
{
if(p->data==no)
find=1;
else
p=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;
分支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;
分支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:不再排队,余下依次就诊——从队首到队尾列出所有的排队病人的病历号,并退出运行。

先用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,退出循环。

下班的关键代码如下:
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<stdio.h>
#include<malloc.h>
typedef struct qnode
{
int data;
struct qnode *next;
}QNode; /*链队结点类型*/
typedef struct
{
QNode *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:下班请选择"); scanf("%d",&sel);
switch(sel)
{ case 1: printf(" >>输入病历号");
do
{
scanf("%d",&no);
find=0;
p=qu->front;
while(p!=NULL&&!find)
{
if(p->data==no)
find=1;
else
p=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 { //队不空
p=qu->front->next;
printf(" >>排队病人");
while(p!=NULL)
{ printf("%d",p->data);
p=p->next;}
printf("\n");
}
break;
case 4: if(qu->front->next==NULL) //队空
printf(" >>没有排队的病人!\n");
else { //队不空
p=qu->front->next;
printf(" >>病人按以下顺序就诊:");
while(p!=NULL)
{
printf("%d",p->data);
p=p->next;
}
printf("\n");
}
break;
case 5:if(qu->front->next!=NULL) //队不空
printf(" >>请排队的病人明天就医!\n");
flag=0; /*退出*/
break;
}
}
}
void main()
{
seeDoctor();
}。

相关文档
最新文档