前情提要
代码使用cpp文件,使用链队。
在病人排队过程中,主要重复两件事:
(1)病人到达诊室,将病历交给护士,排到等待队列中候诊。
(2)护士从等待队列中取出下一位病人的病历,该病人进入诊室就诊。
要求模拟病人等待就诊这一过程。程序采用菜单方式,其选项及功能说明如下:
- 排队——输入排队病人的病历号,加入到病人排队队列中。
- 就诊——病人排队队列中最前面的病人就诊,并将其从队列中删除。
- 查看排队——从队首到队尾列出所有的排队病人的病历号。
- 不再排队,余下顺序就诊——从队首到队尾列出所有的排队病人的病历号,并退出运行。
- 下班——退出运行,提示未就诊的病人明天再来。
#include<stdio.h>
#include<malloc.h>
typedef struct qnode
{//链队节点类型
int data;
struct qnode *next;
}QNode;
typedef struct
{//队头、队尾指针
QNode *front,*rear;
}QuType;
void Destroyqueue(QuType *&qu)
{//自由链队
QNode *p,*q;
p=qu->front;
if(p!=NULL)//若链队不为空
{
q=p->next;
while(q!=NULL)
{//让队中节点自由
free(p);
p=q;
q=q->next;
}
free(p);free(q);
}
free(qu);//自由链队节点
}
void SeeDoctor()
{
int sel,flag=1,find,no;
QuType *qu;
QNode *p;
qu=(QuType *)malloc(sizeof(QuType));//创建空队列
qu->front=qu->rear=NULL;
while(flag==1)//循环执行
{
printf("1.排队;2.就诊;3.查看排队;4.不再排队,余下依次就诊;5.下班\n");
printf("请选择:");scanf("%d",&sel);
switch(sel)
{
case 1:printf("---请输入病例号:");//排队
do{
scanf("%d",&no);
find=0;//如果有重复排队,则为1
p=qu->front;
while(p!=NULL&&!find)//查看是否重复排队
{
if(p->data==no)find=1;
else p=p->next;
}
if(find) printf("---输入病历号重复,请重新输入:");
}while(find==1);//找到重复的,重新读取
p=(QNode *)malloc(sizeof(QNode));//创建新节点
p->data=no;p->next=NULL;//节点赋值
if(qu->rear==NULL)
qu->front=qu->rear=p;//确认第一个节点为p,头结点为p
else{
qu->rear->next=p;
qu->rear=p;
}
break;
case 2:if(qu->front==NULL)//就诊
printf("---没有排队的病人!\n");
else{
p=qu->front;//p节点取第一个节点
printf("---病人%d就诊\n",p->data);
if(qu->rear==p)//如果链队就一个元素,现在便为空
qu->front=qu->rear=NULL;
else//不然前指针就右走一个
qu->front=p->next;
free(p);//自由p节点
}
break;
case 3:if(qu->front==NULL)//查看排队
printf("---没有排队的病人!\n");
else{
p=qu->front;//p节点取第一个节点
printf("---排队病人:");
while(p!=NULL)
{
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}
break;
case 4:if(qu->front==NULL)//不再排队,余下依次就诊
printf("---没有排队的病人!\n");
else{
p=qu->front;//p节点取第一个节点
printf("---病人按照以下顺序就诊:");
while(p!=NULL)
{
printf("%d",p->data);
p=p->next;
}printf("\n");
}
flag=0;
Destroyqueue(qu);
break;
case 5:if(qu->front==NULL)//下班
printf("---没有排队的病人!\n");
printf("提示未就诊的病人明天再来\n");
flag=0;
Destroyqueue(qu);
break;
}
}
}
void main()
{
SeeDoctor();
}
输出
输入
1
3018
1
3019
1
3020
3
2
3
4
5