问题描述:
医院急诊科室,有医生1名
现有病人7名,先后到达
病人病情轻重各有不同(分3级,3级最重,1级最轻),重症的优先就诊;病症相同的,先来的先就诊。
模型假设:
1.病人挂完号后进入对应的科室,每位病人属性包括姓名,性别,和身份证号
2.一开始的时候,医生空闲(等待病人)。
3.有护士根据病人病情,给出病情优先级后,再排队。
4.排队的病人按照先后次序排队,重症的优先就诊,病症相同的,先来的先就诊。。
5.一位医生每次只能看一个病人。
解决方案模型:
1. 程序模拟医院排队就诊,程序开始输入病人资料(包括优先级,姓名,性别,和身份证号)。
2. 设置一个病人的优先队列,按照优先级由高到低,分段排队,最开头的是优先级最高的病人;如果优先级相同,那么按照先来后到的顺序排队。
3. 对病人队列有两种操作,pop与push,医生每次从病人队列里面pop一个病人,并打印病人信息(包括优先级,姓名,性别,和身份证号),直到队列空。
————————————————
运行输入:
请按照优先级,姓名,性别,和身份证号顺序输入:
1 吕雅畅 男 141130198509277099
1 卞丹丹 女 532925197204181629
2 潘德茂 男 500114197005227938
1 邬碧玉 女 620721198202232320
3 金慧雅 女 533123198508252640
2 岑俊茂 男 152526198707214777
3 毕采萱 女 420600198202107509
输出:
就诊顺序......
3 金慧雅 女 533123198508252640
3 毕采萱 女 420600198202107509
2 潘德茂 男 500114197005227938
2 岑俊茂 男 152526198707214777
1 吕雅畅 男 141130198509277099
1 卞丹丹 女 532925197204181629
1 邬碧玉 女 620721198202232320
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define OK 1
#define ERROR 0
int M=0;
int N=0;
typedef int Status;
typedef struct ElemType
{
int level;
char name[20];
char gender;
char ID[20];
}ElemType;
typedef struct Node //结点结构
{
ElemType data;
struct Node *next;
}Node,*QueuePtr;
typedef struct
{
QueuePtr front,rear;
} LinkQueue;
Status InitQueue(LinkQueue *Q) // 队列初始化
{
QueuePtr p;
p=(QueuePtr)malloc(sizeof(QueuePtr));
if(!p)
{
printf("内存分配失败");
return ERROR;
}
Q=(LinkQueue*)malloc(sizeof(LinkQueue));
if(!Q)
{
printf("内存分配失败");
return ERROR;
}
p->next=NULL;
Q->front=p;
Q->front=Q->rear;
return OK;
}
Status EnQueue(LinkQueue *Q, ElemType e) //入队
{
QueuePtr s=(QueuePtr)malloc(sizeof(Node));
if(!s)
{
printf("内存分配失败");
return ERROR;
}
s->data=e;
s->next=NULL;
Q->rear->next=s; //把拥有元素e的新节点s赋值给队尾的后继节点
Q->rear=s; //把当前s设置为队尾节点,rear指向s
return OK;
}
Status DeQueue(LinkQueue *Q,ElemType *e) //出队
{
QueuePtr p;
if(Q->front==Q->rear)
{
printf("队列为空!");
return ERROR;
}
p=Q->front->next; // 将预删除的队头结点暂存给p
*e=p->data; // 将删除的队头结点赋值给e 即出队
Q->front->next=p->next; // 将原队头结点后继p->next 赋值给现投结点后继
if(Q->rear==p)
{
Q->rear=Q->front; //若队头是队尾,则删除后将rear指向头结点
}
free(p);
return OK;
}
Status PriorEnQueue(LinkQueue *Q1,LinkQueue *Q2,ElemType *e)
{
if(e->level==3)
{
EnQueue(Q1,e);
}
else
{
EnQueue(Q2,e);
}
return OK;
}
Status PriorDeQueue(LinkQueue*Q1,LinkQueue*Q2)
{
ElemType *e;
if(!(Q2->front==Q2->rear))
e=DeQueue(Q2,e);
else if(!(Q1->front==Q1->rear))
e=DeQueue(Q1,e);
else
{
return ERROR;
}
return OK;
}
Status GetIN(LinkQueue*Q1,LinkQueue*Q2,ElemType*e)
{
int i;
int n;
printf("请输入前来就诊的病人数量:");
scanf("%d",&n);
for(i=M;i<M+N;i++)
{
printf("\n请输入第%d个病人的优先级:",i+1);
scanf("%d",&e[i].level);
printf("\n请输入第%d个病人的姓名:",i+1);
scanf("%s",e[i].name);
printf("\n请输入第%d个病人的性别:",i+1);
scanf("%s",&e[i].gender);
printf("\n请输入第%d个病人的身份证:",i+1);
scanf("%s",e[i].ID);
PriorEnQueue(Q1,Q2,e);
}
M=M+n;
return OK;
}
Status ShowInformation(ElemType *e)
{
int i;
LinkQueue *Q1,*Q2;
InitQueue(Q1);
InitQueue(Q2);
PriorDeQueue(Q1,Q2);
printf("优先级----------姓名----------性别----------身份证\n");
for(i=N;i<N;i++)
{
printf("\n");
printf("%5d %5s %5s %10s",e[i].level,e[i].name,&e[i].gender,e[i].ID);
}
return OK;
}
int main()
{
LinkQueue *Q1,*Q2;
ElemType *e;
GetIN(Q1,Q2,e);
ShowInformation(e);
return 0;
}