数据结构(实验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();
}