实验目的:
1.掌握队的顺序存储结构和链式存储结构,以便在实际中灵活应用。
2.掌握队列的特点。(重点)
3.掌握队列的基本运算。(重点)
实验内容:
采用链队设计一个算法,反映病人到医院看病、排队看医生的情况。
在病人排队过程中,主要重复两件事:
(1)病人到达诊室,将病历本交给护士,排到等待队列中候诊;
(2)护士从等待队列中取出下一位病人的病历,该病人进入诊室就诊。
要求模拟病人等待就诊这一过程。程序采用菜单方式,下面将对其选项及功能进行说明。
1:排队输入排队病人的病历号,加入到病人排队队列中。
2:就诊病人排队队列中最前面的病人就诊,并将其从队列中删除。
3:查看排队从队头到队尾列出所有的排队病人的病历号。
4:不再排队,余下依次就诊,从队头到队尾列出所有的排队病人的病历号,并退出运行。
5:下班退出运行。
#include <iostream>
using namespace std;
typedef struct QNode {
char data;
struct QNode* next;
}QNode, * QueuePtr; //结点类型 指针类型 QueuePtr为指向结构体QNode的指针型
typedef struct {
QueuePtr front;
QueuePtr rear;
}LinkQueue; //链队列
void InitQNode(LinkQueue& Q) {
Q.front = Q.rear = new QNode; //生成新结点作为头结点,队头和队尾指针指向此结点 /单链表:新生一个结点指向此结点
if (!Q.front) {
cout << "医院暂时还是关门的,抱歉!" << endl;
}
else {
Q.front->next = NULL; //新生头结点指针域置空
cout << "医院的医生来了,排好队就医! " << endl;
}
}
void PushQueue(LinkQueue& Q) { //入队
QNode* p;
int n=5;
cout << "请护士将病人默认排编号(每次只能排编5人):";
for (int i = 0; i < n; i++) {
p = new QNode;
char e; cin >> e;
p->data = e;
p->next = NULL; //新建一个结点 为了接在尾指针后面
Q.rear->next = p; //1.修改尾指针 将链队列的最后一个元素的下一个指向新建的p结点
Q.rear = p; //将队列的最后一个直接指向p//将队列p作为最后一个元素
}
}
void PopQueue(LinkQueue& Q) { //出队
QNode* p;
int n=1;
char e;
for (int i = 0; i < n; i++) {
if (Q.front == Q.rear) { //判断是否为空
cout << "无人排队,请先排队!";
}
else {
p = new QNode; //新创结点,存出队列元素
p = Q.front->next; //将第一个元素赋值给p
e = p->data; //第一个元素赋值给e
if (p->next==NULL){ //如果遇到最后一个指针,删除结点,并让头尾结点指向头结点
cout <<"护士:请病人"<< e << "进入诊室就医。"<< endl;
Q.front->next = p->next; //将p 的下一个最为第一个元素
Q.front = Q.rear;
}
else{
cout << "护士:请病人" << e << "进入诊室就医。下一位" << p->next->data << "做好准备。" << endl;
Q.front->next = p->next; //将p 的下一个最为第一个元素
}
delete p; cout << "医生:病人就医结束,下一位!" << endl;
}
}
}
void GetHead(LinkQueue& Q ,int &count) {
if (Q.front != Q.rear) {
PopQueue(Q);
GetHead(Q, count);
}
else{
if (count==1){
cout << "时间不早了,抱歉各位,不再排队,余下依次就医。" << endl;
}
else {
cout << "护士:下面进行下一轮排队。" << endl;
PushQueue(Q);
++count;
GetHead(Q,count);
}
}
}
void DesQueue(LinkQueue& Q) {
//while (Q.front) {
// p = Q.front->next; //实现将 Q.front->next给新的结点p
// delete Q.front; //在将Q.front销毁
// Q.front = p; //在将结点p赋值给Q.front(Q.front结点指向p)
//}
cout << "下班退出运行。" << endl;
}
int main() {
int count = 0;
LinkQueue Q;
cout << "1.";
InitQNode(Q);
cout << "2.";
PushQueue(Q);
cout << "3.";
PopQueue(Q);
cout << "4.";
GetHead(Q,count);
cout << "5.";
DesQueue(Q);
}
本次就不写具体内容啦哈,后面学习树的地方经常遇到递归(自己调用自己),遍历树等...
大家后续学习会理解更深的,下面给大家配上代码的运行截图: