采用循环队列或链队列实现病人看病的模拟程序
(1)定义队列的存储结构;
(2)实现队列的初始化、判断是否为空、入队、出队等基本操作;
(3)调用队列的基本操作实现病人看病模拟程序包括排队、就诊、查询、退出等功能;
//@立木
#include<stdio.h>
#include<stdlib.h>
#define MaxSize 100
typedef int ElemType;
typedef struct
{
ElemType data[MaxSize];
int front, rear;
}SqQueue;
SqQueue *q1;
void InitQueue(SqQueue *&q) //初始化
{
q=(SqQueue *)malloc(sizeof(SqQueue));
q->front=q->rear=-1;
}
void DestroyQueue(SqQueue *&q) //销毁队列
{
free(q);
}
bool QueueEmpty(SqQueue *q) //判断是否为空
{
return(q->front==q->rear);
}
bool enQueue(SqQueue *&q,ElemType e) //进队列
{
if(q->rear==MaxSize-1)
return false;
q->rear++;
q->data[q->rear]=e;
return true;
}
bool deQueue(SqQueue *&q,ElemType e) //出队列
{
if(q->rear==q->front)
return false;
q->front++;
e=q->data[q->front];
return true;
}
void seedoctor()
{
InitQueue(q1);
int a,b=0,x; //a为命令,b为最后排队的患者序号 ,x用于退出程序 。
int d=0,f=0,g=0; //d,f,g用于计数,用户输入错误命令3次,退出程序!
int m = 0; //m为已经就诊的总人数 或者 当前正在就诊的患者的序号 。
printf("--------看病系统--------\n");
printf("(队尾患者优先就诊)\n");
printf("1.排队");
printf("2.就诊");
printf("3.查询");
printf("4.退出");
//排在队尾的先就诊
while(x)
{
printf("\n请输入命令:");
scanf("%d",&a);
switch(a)
{
case 1: //排队
b++;
enQueue(q1,b);
printf("患者已成功挂号正在排队,序号为:%d\n",b);
//printf("现在队尾患者序号为:%d\t",m+1);
//printf("排队人数:%d",b-m); // b-m 为当前排队人数
break;
case 2: //就诊
if(b-m<1) // 当前排队人数小于1 ,error
{
printf("error");
g++;
if(g==3)
{
printf("\n▲您已错误输入命令3次,程序自动退出!");
x=0;
}
}
else
{
if(b>m) // 最大的排队序号必须大于 已经 就诊的总人数 m,此时才有患者在就诊
{
deQueue(q1,m+1);
printf("患者%d正在就诊\n",m+1);
m++;
if(b-m==0) //最后排队的患者序号 减 已经就诊的总人数等于0 时,没有人排队
printf("当前无人排队!\n");
else
printf("现在队尾患者序号为:%d\n",1+m); //否则当前排队的患者为 已经就诊的总人数+1号
}else
{
printf("error,当前无人排队,无人就诊!");
f++;
if(d==3)
{
printf("\n▲您已错误输入命令3次,程序自动退出!");
x=0;
}
}
}
break;
case 3: //查询
if(QueueEmpty(q1))
printf("当前排队人数:%d\n",b-m);
printf("当前正在就诊的患者为:%d号\n",m);
break;
case 4: //退出
DestroyQueue(q1);
printf("看病结束,退出程序!");
x=0;
break;
default:
printf("error,请重新输入:");
d++;
if(d==3)
{
printf("\n▲您已错误输入命令3次,程序自动退出!");
x=0;
}
}
}
}
int main()
{
seedoctor();
return 0;
}