编制一个病人看病模拟程序。在病人排队过程中,主要重复两件事:
1、病人到达诊室,将病历本交给护士,排到等待队列中候诊。
2、护士从等待队列中取出下一位病人的病历,该病人进入诊室就诊。
程序采用菜单方式,其选项及功能说明如下:
- 排队——输入排队病人的病历号,加入到病人排队队列中。
- 就诊——病人排队队列中最前面的病人就诊,并将其从队列中删除。
- 查看排队——从队首到队尾列出所有的排队病人的病历号。
- 下班——退出运行。
运行效果
排队:
就诊:
查看排队:
下班:
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char** argv) {
SeeDoctor();
return 0;
}
typedef int ElemType;
//----- 队列的链式存储-----
typedef struct qnode
{ // 结点类型
ElemType data;
struct qnode *next;
} QNode;
typedef struct
{ // 链队列类型
QNode* front; // 队头指针
QNode* rear; // 队尾指针
}LiQueue;
void InitQueue(LiQueue *&q)
{
q=(LiQueue *)malloc(sizeof(LiQueue));
q->front=q->rear=NULL;
}
void DestroyQueue(LiQueue *&q)
{
QNode *p=q->front,*r; //p指向队头数据节点
if (p!=NULL) //释放数据节点占用空间
{
r=p->next;
while (r!=NULL)
{
free(p);
p=r;
r=p->next;
}
}
free(p);
free(q); //释放链队节点占用空间
}
bool QueueEmpty(LiQueue *q)
{
return(q->rear==NULL);
}
void enQueue(LiQueue *&q,ElemType e)
{
QNode *p;
p=(QNode *)malloc(sizeof(QNode));
p->data=e;
p->next=NULL;
if (q->rear==NULL) //若链队为空,新节点是队首节点又是队尾节点
q->front=q->rear=p;
else
{
q->rear->next=p;//将*p节点链到队尾,并将rear指向它
q->rear=p;
}
}
bool deQueue(LiQueue *&q,ElemType &e)
{
QNode *t;
if (q->rear==NULL)
return false; //队列为空
t=q->front; //t指向第一个数据节点
if (q->front==q->rear) //队列中只有一个节点时
q->front=q->rear=NULL;
else //队列中有多个节点时
q->front=q->front->next;
e=t->data;
free(t);
return true;
}
void DispQueue(LiQueue *q)
{ //从队头到队尾,逐个显示出来
QNode *p= q->front;
while(p != NULL)
{
printf("%4d",p->data);
p = p->next;
}
}
void SeeDoctor()
{
LiQueue *Q;
InitQueue(Q);
int select,flag=1;
int num; //num为病历号
while(flag == 1)
{
printf("\n\n==========================================");
printf("\n1:排队 2:就诊 3:查看排队 4:下班 请选择:");
scanf("%d",&select);
switch(select)
{
case 1:
printf("--->>请输入病历号:");
scanf("%d",&num);
enQueue(Q,num);
printf("排队的病人依次是:");
DispQueue(Q);
break;
case 2:
if(QueueEmpty(Q))
printf("--->>没有排队的病人!\n");
else
{
deQueue(Q,num);
printf("当前就诊的是:%d\n",num);
printf("排队的病人依次是:");
DispQueue(Q);
}
break;
case 3:
if(QueueEmpty(Q))
{
printf("--->>没有排队的病人!\n");
}
else
{
printf("--->>排队的病人按以下顺序就诊:\n");
DispQueue(Q);
}
break;
case 4:
if(!QueueEmpty(Q))
printf("--->>请排队的病人明天就医!\n");
flag = 0;
DestroyQueue(Q);
break;
}
}
}