采用循环队列或链队列实现病人看病的模拟程序

采用循环队列或链队列实现病人看病的模拟程序

(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;
}
  • 8
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值