队列的基本操作与应用

数据结构(实验C语言版)

队列的基本操作与应用

一、实验目的

1、掌握链式存储队列的进队和出队等基本操作
2、了解队列的应用

二、实验环境

硬件环境要求:
PC机(单机)
使用的软件名称、版本号以及模块:
VS2010或Visual C++ 6.0或Win-TC等。

三、实验内容

编写一个程序,反映病人到医院看病,排队看医生的情况。在病人排队过程中,主要重复两件事:
(1)病人到达诊室,将病历本交给护士,排到等待队列中侯诊。
(2)护士从等待队列中取出下一位病人的病历,该病人进入诊室就诊。
要求模拟病人等待就诊这一过程。程序采用菜单方式,其选项及功能说明如下:
(1)排队–输入排队病人的病历号,加入到病人排队队列中。
(2)就诊–病人排队队列中最前面的病人就诊,并将其从队列中删除。
(3)查看排队–从队首到队尾列出所有的排队病人的病历号。
(4)不再排队,余下依次就诊–从队首到队尾列出所有的排队病人的病历号,并退出运行。

四、实验要求
1、用 VS2010 工具创建文件或程序,输入代码后,进行编译运行或在控制台 执行。
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(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:下班  请选择:");
		scanf("%d", &sel);
		switch (sel)
		{
		case 1:	printf("  >>输入病历号:");
			do
			{
				scanf("%d", &no);
				find = 0;
				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;
			else
			{
				qu->rear->next = p; qu->rear = p;	//将*p节点入队
			}
			break;
		case 2:	if (qu->front == NULL)				//队空
			printf("  >>没有排队的病人!\n");
				else								//队不空
				{
					p = qu->front;
					printf("  >>病人%d就诊\n", p->data);
					if (qu->rear == p)			//只有一个病人排队的情况
						qu->front = qu->rear = NULL;
					else
						qu->front = p->next;
					free(p);
				}
				break;
		case 3:if (qu->front == NULL)  			//队空
			printf("  >>没有排列的病人!\n");
			   else 							//队不空
			   {
				   p = qu->front;
				   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;
				   printf("  >>病人按以下顺序就诊:");
				   while (p != NULL)
				   {
					   printf("%d ", p->data);
					   p = p->next;
				   }
				   printf("\n");
			   }
			   Destroyqueue(qu);				//释放链队
			   flag = 0;						//退出
			   break;
		case 5:if (qu->front != NULL)			//队不空
			printf("  >>请排队的病人明天就医!\n");

			flag = 0;						//退出
			Destroyqueue(qu);				//释放链队
			break;} } }
void main()
{
	SeeDoctor();
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

chj65

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值