设计内容:
设计一个医院候诊排队系统。问题描述:医院各科室的医生有限,因此病人到医院看病时必须排队候诊,而病人的病情有轻重之分,不能简单的根据先来先服务的原则进行诊断治疗,所以医院根据病人的病情规定了不同的优先级别。医生在诊断治疗时,总是选择优先级别高的病人先治疗,如果遇到两个优先级别相同的病人,则选择最先来排队的病人进行诊治。
设计要求:
- (1)用队列模拟上述排队候诊的问题,建立队列分别对应不同优先级别,按照从终端读入的输入数据的方式进行模拟管理。
输入1,表示有新的病人加入队列候诊,根据病情指定其优先级别;
输入2,表示医生根据优先级别为病人进行诊治;
输入3,表示退出系统。 - (2)要求界面友好美观,操作方便易行;
- (3) 注意程序的实用性、安全性;
本设计采用的数据结构
(1)数据结构类型:链式队列
(2)原因:病人排队,医生看诊要先来排队的优先看病,也就满足数据结构中的“先进先出”原则,所以要选用队列。但由于人数不定,所以不适合用顺序存储队列,而链式队列较合适。
(3)定义:
typedef int QElemType;
typedef int Status;
typedef struct QNode{
QElemType data; //病人的编号
struct QNode *next; //下一个病人编号的地址
}QNode,*Queueptr;
typedef struct{
Queueptr front;
Queueptr rear;
}LinkQueue;
系统功能模块结构图及主要函数说明
4.2主要函数
- (1)构造空队列 Status InitQueue(LinkQueue &q)
为操作方便,可以为链队列添加一个头结点,并令头指针指向头结点。空的链队列的判决条件:头指针和尾指针均指向头结点。 - (2)入队 Status EnQueue(LinkQueue &q,QElemType e) ;
插入元素e作为新的队尾元素。为结点p分配空间,p->data编号加一,p->next为空,将p结点连接到q的最后。 - (3)出队 Status DeQueue(LinkQueue &q,QElemType &e);
从队列中从前往后出队,当队头指针与队尾指针不相等时,将队头指针的data值
赋给x,队头指针后移。返回x的值。 - (4)void MyEnQueue(LinkQueue &q1,LinkQueue &q2,QElemType e,int priority);
根据病人的优线级分别入队 根据传入的priority的值进去相应的队列。 - (5)Status MyDeQueue(LinkQueue &q1,LinkQueue &q2);
按照病情轻重出队。即q2,q1的顺序。在同一优先级里,根据data的顺序出队
及从小到大的顺序。在判断q2不为空的情况下,data从小到大出队,e返回data值
他情况类似)在两个队都为空时,e=-1。
4.3 函数说明
int main() //主函数
Status InitQueue(LinkQueue &q);//创建一个空队列
Status EnQueue(LinkQueue &q,QElemType e); //插入元素e作为新的队尾元素
Status DeQueue(LinkQueue &q,QElemType &e); //删除元素e,并返回
Status EmptyQueue(LinkQueue &q);// 判断队列是否为空,若为空返回0
void MyEnQueue(LinkQueue &q1,LinkQueue &q2,QElemType e,int priority);
//根据优先级入队
Status MyDeQueue(LinkQueue &q1,LinkQueue &q2);//根据优先级出队
N-S流程图如下
程序运行数据及其结果
数据输入类型:键盘输入
运行结果分析:
当病情严重的队列不为空时,优先q2出队;当q2为空时,q1出队;当队都为空时,提示“无诊治病人,队列为空”。
源代码
#include <stdio.h>
#include <stdlib.h>
#include<windows.h>
#include<string.h>
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef int QElemType;
typedef int Status;
typedef struct QNode{
QElemType data; //病人的编号
struct QNode *next; //下一个病人编号的地址
}QNode,*Queueptr;
typedef struct{
Queueptr front;
Queueptr rear;
}LinkQueue;
//创建一个空队列
Status InitQueue(LinkQueue &q)
{
q.front=q.rear=(Queueptr)malloc(sizeof(QNode));
if(q.front==NULL)
{
exit(OVERFLOW);
}
q.front->next=NULL;
return OK;
}
//插入元素e作为新的队尾元素
Status EnQueue(LinkQueue &q,QElemType e)
{
Queueptr p;
p=(Queueptr)malloc(sizeof(QNode));
if(!p)
{
exit(OVERFLOW);
}
p->data=e;
q.rear->next=p;
q.rear=p;
return OK;
}
Status DeQueue(LinkQueue &q,QElemType &e)
{
Queueptr p;
if(q.rear==q.front)
{
return ERROR;
}
p=q.front->next;
e=p->data;
q.front->next=p->next;
if(q.rear==p)
{
q.rear=q.front;
}
free(p);
return e;
}
Status EmptyQueue(LinkQueue &q)
{
int r=0;
if(q.front==q.rear)
{
r=0;
}
else
{
r=1;
}
return r;
}
void MyEnQueue(LinkQueue &q1,LinkQueue &q2,QElemType e,int priority)
{
//确定是哪个优先级的病人并且入相应的队列
if(priority==1)
{
EnQueue(q1,e);
}
else
{
EnQueue(q2,e);
}
}
Status MyDeQueue(LinkQueue &q1,LinkQueue &q2)
{
//出队
QElemType e;
if(EmptyQueue(q1))
{
e=DeQueue(q1,e);
}
else if(EmptyQueue(q2))
{
e=DeQueue(q2,e);
}
else
{
e=-1;
}
return e;
}
struct PT{
char name[20];
int age;
char sex;
char xueli[10]; //学历
char address[70];//住址
int telephone; //电话号码
char department[70]; //部门
int priority;
};
int main() //主函数
{
LinkQueue q1,q2; //分别表示低级和高级的病人队列
QElemType idi=1,ido=-1; //分别表示入队和出队的病人的id
int menu=0; //分别为用户选择的菜单编号和病人看病的优先级别
InitQueue(q1);
InitQueue(q2);
struct PT pt[100];
printf("\n\n");
printf(" ---------------------------------------------------------------------------------\n\n");
printf(" *********************************************************************************\n\n");
printf("\n");
printf(" ** 欢迎使用××医院排队系统 **\n");
printf("\n");
printf(" ** 1. 新的病人加入队列候诊 **\n");
printf("\n");
printf(" ** 2. 医生根据优先级别为病人进行诊治 **\n");
printf("\n");
printf(" ** 3. 打印病人的目录(只有管理员才可以哦) **\n");
printf("\n");
printf(" ** 4. 退出系统 **\n");
printf("\n");
printf(" *********************************************************************************\n\n");
printf(" ---------------------------------------------------------------------------------\n\n");
int i,k=0; //i代表之后循环点的次数 k代表循环次数,本程序中,错误超过三次,会退出系统。
char users[50],mima[30]; //定义用户名,密码 。
system("color 2f"); //设置背景颜色。
while(1)
{
printf(" ---------------------------------------------------------------------------------\n\n");
printf(" 请按编号选择相应的操作:\n");
printf(" ");
scanf("%d",&menu);
switch(menu)
{
case 1:{
printf(" 新病人加入候诊队列\n");
printf("\n\n");
printf(" 请登记病人的基本情况:\n\n\n");
printf(" 姓名 性别(男m女f) 年龄 学历 住址 电话号码 部门 病人的优先级\n");
printf(" 姓名: ");
scanf("%s",&pt[idi].name);
// fflush(stdin); (功能是清除缓存)
getchar();
printf(" 性别:(m/f)");
scanf("%c",&pt[idi].sex);
printf(" 年龄: ");
scanf("%d",&pt[idi].age);
printf(" 学历(博士/研究生/本科/大专/高中/初中/小学): ");
scanf("%s",pt[idi].xueli);
printf(" 家庭地址: ");
scanf("%s",pt[idi].address);
printf(" 电话号码: ");
scanf("%d",&pt[idi].telephone);
printf(" 挂号部门: ");
scanf("%s",pt[idi].department);
printf(" 病情严重性(非常严重请输入1,否则输入2): ");
scanf("%d",&pt[idi].priority);
printf("\n");
printf(" 谢谢您的配合。挂号成功!请您耐心等待!\n");
printf(" 该病人的ID是:%d\n",idi);
MyEnQueue(q1,q2,idi,pt[idi].priority);
idi++;
break;
}
case 2:{
ido=MyDeQueue(q1,q2);
if(ido!=-1)
{
printf(" 当前被诊治的病人的id是:%d\n",ido);
}
else
{
printf(" 无诊治病人,队列为空!");
}
break;
}
case 3:{
int i=1;
for(i=0;i<3;i++)
{
getchar();
printf("\n 请先登录,只有管理员才可以打印病人信息哦!");
printf("\n\n 请输入用户名:");
gets(users);
printf("\n 请输入密码:");
gets(mima);
if((strcmp(users,"123")==0)&&(strcmp(mima,"123")==0))
{
printf("\n 您已经成功登录");
printf("\n 请稍等");
for(i=0;i<20;i++)
{
printf(".");
Sleep(100);
}
printf("\n\n\n");
break;
}
k++;
if(k<3)
{
printf("\n 用户名或密码无效 请重新输入:\n");
}
if(k==3)
{
printf("\n 连续输入错误3次 将退出程序\n");
Sleep(2000);
exit(0);
}
}
printf(" 打印当前病人的目录:\n\n\n");
printf(" ---------------------------------------------------------------------------------\n\n");
printf(" 序号 姓名 性别 年龄 学历 住址 电话号码 挂号部门 病情优先级 \n\n");
for(i=1;i<idi;i++)
{
printf(" %d %s %c %d %s %s %d %s %d \n\n",i,pt[i].name,pt[i].sex,pt[i].age,pt[i].xueli,pt[i].address,pt[i].telephone,pt[i].department,pt[i].priority);
}
printf(" ---------------------------------------------------------------------------------\n\n");
break;
}
case 4:{
printf("\n 谢谢使用,再见!\n");
break;
}
default:{
printf(" 输入有误,请按菜单编号输入。\n");
}
}
}
}