设计一个医院候诊排队系统。问题描述:医院各科室的医生有限,因此病人到医院看病时必须排队候诊,而病人的病情有轻重之分,不能简单的根据先来先服务的原则进行诊断治疗,所以医院根据病人的病情规定了不同的优先级别。医生在诊断治疗时,总是选择优先级别高的病人先治疗,如果遇到两个优先级别相同的病人,则选择最先来排队的病人进行诊治。
(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.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("nn");
printf(" ---------------------------------------------------------------------------------nn");
printf(" *********************************************************************************nn");
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(" *********************************************************************************nn");
printf(" ---------------------------------------------------------------------------------nn");
int i,k=0; //i代表之后循环点的次数 k代表循环次数,本程序中,错误超过三次,会退出系统。
char users[50],mima[30]; //定义用户名,密码 。
system("color 2f"); //设置背景颜色。
while(1)
{
printf(" ---------------------------------------------------------------------------------nn");
printf(" 请按编号选择相应的操作:n");
printf(" ");
scanf("%d",&menu);
switch(menu)
{
case 1:{
printf(" 新病人加入候诊队列n");
printf("nn");
printf(" 请登记病人的基本情况:nnn");
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是:%dn",idi);
MyEnQueue(q1,q2,idi,pt[idi].priority);
idi++;
break;
}
case 2:{
ido=MyDeQueue(q1,q2);
if(ido!=-1)
{
printf(" 当前被诊治的病人的id是:%dn",ido);
}
else
{
printf(" 无诊治病人,队列为空!");
}
break;
}
case 3:{
int i=1;
for(i=0;i<3;i++)
{
getchar();
printf("n 请先登录,只有管理员才可以打印病人信息哦!");
printf("nn 请输入用户名:");
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("nnn");
break;
}
k++;
if(k<3)
{
printf("n 用户名或密码无效 请重新输入:n");
}
if(k==3)
{
printf("n 连续输入错误3次 将退出程序n");
Sleep(2000);
exit(0);
}
}
printf(" 打印当前病人的目录:nnn");
printf(" ---------------------------------------------------------------------------------nn");
printf(" 序号 姓名 性别 年龄 学历 住址 电话号码 挂号部门 病情优先级 nn");
for(i=1;i<idi;i++)
{
printf(" %d %s %c %d %s %s %d %s %d nn",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(" ---------------------------------------------------------------------------------nn");
break;
}
case 4:{
printf("n 谢谢使用,再见!n");
break;
}
default:{
printf(" 输入有误,请按菜单编号输入。n");
}
}
}
}
本文发布于:2025-02-21 20:29:00,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/1740140965579174.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |