队列应用----模拟患者看病

队列应用-----模拟患者医院看病过程

患者医院看病过程是,先排队等候,再看病治疗。在排队的过程中主要重复做两件事情,一是患者到达诊室时,将病历交给护士,排到等候队列中就诊;二是护士从等候队列中取出下一个患者的病历,该患者进入诊室看病。

【算法思想】

在排队中按照“先到先服务”的原则,设计一个算法模拟病人等候就诊的过程。其中“病人到达”用a表示,“护士让下一位患者就诊”用命令n表示,“不在接受病人排队”用q表示。

本算法采用链队存放患者的病历号:

①当有“病人到达”命令时,则入队。

②当有“护士让下一位患者就诊”命令时,则出队。

③当有:“不在接受病人排队”命令时,则队列中的所有元素出队,程序终止。
【算法描述】

void SeeDoctor()
{
	InitQueue(Q);	
	int flag=1;
	while(flag)
	{
		printf("\n请输入命令:");
		ch=getch();
		switch(ch){
			case 'a':printf("\n病历号:");
					 scanf("%d",&n);
					 EnterQueue(&Q,n);
					 break; 
			case 'n':if(!IsEmpty(Q))
					 {
					 	DeleteQueue(&Q,&n);
							printf("\n病历号为%d的病人就诊",n);
					 }
					 else	
					 	printf("\n无病人等候就诊"); 
					 break; 
			case 'q':printf("\n今天停止挂号,下列病人一次就诊:");
					 while(!IsEmpty(Q))
					 {
					 	DeleteQueue(&Q,&n);
					 	printf("%d",n);
					 }
					 flag=0;
					 break; 
			default:printf("\n非法命令!");
		}
	}
}

【完整算法代码】

#include<stdio.h>
#include<stdlib.h>
#include <malloc.h>
#include<conio.h>
typedef int QElemType;
int ch,n; 
//存储结构
typedef struct QNode 
{
	QElemType data;
	struct QNode *next;
}Qnode, *QueuePtr;
 
//队头队尾指针
typedef struct 
{
	QueuePtr front;//对头指针
	QueuePtr rear; //队尾指针
}LinkQueue;
LinkQueue Q;
//构造一个空队列
void InitQueue(LinkQueue &Q) 
{
	Q.front = Q.rear = (QueuePtr)malloc(sizeof(QNode));
	Q.front->next = NULL;
}
//判断是否为空
bool IsEmpty(LinkQueue &Q) 
{
	if (Q.front == Q.rear) return true;
	return false;
}
//入队
void EnterQueue(LinkQueue &Q, QElemType &e) 
{
	Qnode *p;
	p = (QueuePtr)malloc(sizeof(QNode));
	p->data = e;
	p->next = NULL;
	Q.rear->next = p;
	Q.rear = p;
}
//出队
void DeleteQueue(LinkQueue &Q, QElemType &e) 
{
	Qnode *p;
	p = Q.front->next;
	e = p->data;
	Q.front->next = p->next;
	if (Q.rear == p)
		Q.rear = Q.front;
	free(p);
}
//看病 
void SeeDoctor()
{
	InitQueue(Q);	
	int flag=1;
	while(flag)
	{
		printf("\n请输入命令:");
		ch=getch();
		switch(ch){
			case 'a':printf("\n病历号:");
					 scanf("%d",&n);
					 EnterQueue(Q,n);
					 break; 
			case 'n':if(!IsEmpty(Q))
					 {
					 	DeleteQueue(Q,n);
							printf("\n病历号为%d的病人就诊",n);
					 }
					 else	
					 	printf("\n无病人等候就诊"); 
					 break; 
			case 'q':printf("\n今天停止挂号,下列病人依次就诊:\n");
					 while(!IsEmpty(Q))
					 {
					 	DeleteQueue(Q,n);
					 	printf("%d\n",n);
					 }
					 flag=0;
					 break; 
			default:printf("\n非法命令!");
		}
	}
}
int main()
{
	SeeDoctor();
	return 0;
} 

【运行截图】

 

评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值