前情提要

代码使用cpp文件,使用链队。

在病人排队过程中,主要重复两件事:

(1)病人到达诊室,将病历交给护士,排到等待队列中候诊。

(2)护士从等待队列中取出下一位病人的病历,该病人进入诊室就诊。

要求模拟病人等待就诊这一过程。程序采用菜单方式,其选项及功能说明如下:

  1. 排队——输入排队病人的病历号,加入到病人排队队列中。
  2. 就诊——病人排队队列中最前面的病人就诊,并将其从队列中删除。
  3. 查看排队——从队首到队尾列出所有的排队病人的病历号。
  4. 不再排队,余下顺序就诊——从队首到队尾列出所有的排队病人的病历号,并退出运行。
  5. 下班——退出运行,提示未就诊的病人明天再来。
#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();
}

输出

模拟叫号看病Java 模拟就诊_等待队列

 

输入

1
3018
1
3019
1
3020
3
2
3
4
5