数据结构 线性表 医院

前言

要求

项目名称:医院排队系统
项目内容:编写一个程序模拟患者到医院看病排队挂号就诊的情况。在患者排队过程中:
(1)患者到达诊室,将病历本交给护士,排到等待队列中候诊。
(2)护士从等待队列中取出下一位患者的病历,该患者进入诊室就诊。
(3)医生下班,提醒余下患者明日就诊。

结果

在这里插入图片描述

实验文档

源.cpp 介绍

这段代码是一个简单的排队系统,主要功能如下:

  1. 包含头文件、和自定义的队列类LinkQueue.h。
  2. 定义了一个函数menu()用于显示菜单。
  3. 定义了一个函数main()作为程序的主函数。
  4. 在main()函数中,创建了一个队列指针p,用于存储患者的姓名。
  5. 定义了一个布尔变量f,用于判断程序是否继续运行。
  6. 定义了一个医院对象hp,用于处理患者的排队、就诊等操作。
  7. 使用一个do-while循环来显示菜单,直到用户选择退出程序。
  8. 在循环中,根据用户输入的选项,调用相应的函数进行操作。
  9. 如果用户选择退出程序,将f设置为false,退出循环。
  10. 最后,输出成功退出系统的提示信息。

总结:这是一个简单的排队系统,实现了基本的排队、就诊和查询排队人数等功能

Queue.cpp 介绍

这是一个C++语言的模板类定义,定义了一个名为LinkQueue的队列类,以及一个名为Hospital的医院类。这两个类都使用了模板参数T,表示队列中元素的类型。

LinkQueue类定义了一个单链表作为队列的数据结构,包含头节点和尾节点指针。该类提供了以下方法:

  1. 构造函数:初始化头节点和尾节点指针。
  2. 析构函数:释放队列中的所有节点。
  3. empty():检查队列是否为空。
  4. push(T e):将元素e入队。
  5. pop(T &e):将队列头部的元素赋值给e,并将其出队。
  6. gethead(T &e):将队列头部的元素赋值给e,不将其出队。

Hospital类定义了一个名为enQueue()的方法,用于将一个名为p的队列指针入队。该方法调用LinkQueue类的push()方法将p入队。Hospital类还定义了一个名为visit()的方法,用于访问队列p中的病人。该方法调用LinkQueue类的gethead()方法将队列头部的元素赋值给一个名为e的临时变量,然后调用Hospital类的timer()方法判断e是否需要离开医院。最后,Hospital类定义了一个名为total()的方法,用于计算队列p中的病人总数。

这个文档主要是针对LinkQueue和Hospital两个类进行说明,没有涉及到具体的实现细节

Queue.cpp 源码

#include <iostream>
#include <ctime>
#include <string>
#include "Queue.h"
using namespace std;

template <class T>
LinkQueue<T>::~LinkQueue()
{
	//~ 销毁队列时,将队列中的元素全部释放
	while (front != NULL)
	{
		rear = front->next;
		delete front;
		front = rear;
	}
}

template <class T>
bool LinkQueue<T>::empty()
{
	//~ 判断队列是否为空
	if (front == rear)
	{
		return true;
	}
	return false;
}

template <class T>
bool LinkQueue<T>::push(T e)
{
	//~ 向队列中添加元素
	if (empty())
	{
		rear = new LinkNode<T>();
		rear->data = e;
		front = rear;
		rear = new LinkNode<T>();
		front->next = rear;
		return true;
	}
	rear->data = e;
	LinkNode<T> *p = rear;
	rear = new LinkNode<T>();
	p->next = rear;
	return true;
}

template <class T>
bool LinkQueue<T>::pop(T &e)
{
	//~ 从队列中取出元素
	if (empty())
	{
		return false;
	}
	LinkNode<T> *p;
	p = front;
	e = front->data;
	front = front->next;
	delete p;
	return true;
}

template <class T>
bool LinkQueue<T>::gethead(T &e)
{
	//~ 获取队列中的第一个元素
	if (empty())
	{
		return false;
	}
	e = front->data;
	return true;
}

bool Hospital::timer()
{
	//~ 判断是否在就诊时间内
	time_t now = time(0);
	tm ntime;
	gmtime_s(&ntime, &now);
	if (ntime.tm_hour >= 20 || ntime.tm_hour <= 8)
	{
		cout << "医生也需要休息哦!" << endl;
		cout << "就诊时间:上午八点--十二点" << endl;
		cout << "         下午一点到下午八点" << endl;
		return false;
	}
	return true;
}

bool Hospital::enQueue(LinkQueue<string> *p)
{
	//~ 排队
	if (!timer())
	{
		cout << "请在就诊时间内排队" << endl;
		return false;
	}
	string name;
	cout << "请输入你的姓名:";
	cin >> name;
	if (p->push(name))
	{
		cout << "排队成功!请耐心等待" << endl;
		return true;
	}
	cout << "系统繁忙,请稍后再试(如果多次失败,请询问护士)" << endl;
	return false;
}

bool Hospital::visit(LinkQueue<string> *p)
{
	//~ 就诊
	string name;
	if (!timer())
	{
		cout << "请下午一点或明天再来" << endl;
		return false;
	}
	if (p->pop(name))
	{
		cout << name << "患者请进室就诊" << endl;
		if (p->gethead(name))
		{
			cout << name << "患者请准备" << endl;
		}
		return true;
	}
	cout << "空闲" << endl;
	return true;
}

int Hospital::total(LinkQueue<string> *p)
{
	//~ 计算队列中的元素个数
	int i = 0;
	LinkNode<string> *a = p->front;
	while (a != p->rear)
	{
		a = a->next;
		i++;
	}
	return i;
}

收尾

声明

注意:以上文档皆由 vscode上的codegeex插件根据相应代码生成(真的好用啊!)
可以防止以后自己都看不懂自己的代码
在这里插入图片描述

全部源码

如果需要全部源码,
我的github仓库
我的gitee仓库https://gitee.com/aa2255/smalltask

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

杀小白

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

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

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

打赏作者

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

抵扣说明:

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

余额充值