第四期 03季 C/C++数据结构 链队的应用

实验目的:

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);
}

 本次就不写具体内容啦哈,后面学习的地方经常遇到递归(自己调用自己),遍历树等...

大家后续学习会理解更深的,下面给大家配上代码的运行截图:

 

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

赵相机~

谢谢你,调试、讲解私聊我~

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

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

打赏作者

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

抵扣说明:

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

余额充值