医院排号,队列,包括输入病人信息,医生叫号,查询剩余病人情况,大家快来看,欢迎批评指正

/*
文件名称:ds.h

*/

 #include <iostream> //c++标准输入输出  
 #include<stdio.h>   //c标准输入输出
 #include<string.h>  //c和c++字符串
#include <array>
 #include<ctype.h>   //字符库
 #include<malloc.h> /* malloc()等 */
 #include<io.h> /* eof() ,缓冲读写磁盘*/
 #include<math.h> /* floor(),ceil(),abs() */
 #include<process.h> /* exit() */
 #include <time.h> //时间相关库
 #include<iomanip> //cout输出控制精度用
 #include <windows.h>//GetSystemTime 获得UTC(等于GMT)时间,GetLocalTime 获得系统本地时间

/* 函数结果状态代码 */
 #define TRUE 1
 #define FALSE 0
 #define OK 1
 #define ERROR 0
 #define INFEASIBLE -1
 #define SUCCESS 1
 #define UNSUCCESS 0
 #define DUPLICATED -1
 #define NULL_KEY 0 // 0为无记录标志

 #define MAXSIZE 50
 #define PI 3.14
 #define NUM 100

 // typedef为C语言的关键字,作用是为一种数据类型定义一个新名字。
 //Status是函数返回值的类型,其值是函数结果状态代码,如OK ERROR等 */
 typedef int Status; 

#include "ds.h"
using namespace std;
struct patient
{
	int data;  //排号
	char name[20];  //患者姓名
	int age;  //年龄
	char sex[2]; 
};
typedef patient ET;
struct QNode
{
	 ET data;  //栈的最大长度
	 QNode *next;   //指向栈顶位置
};
typedef QNode *QueuePtr;   //入栈元素char型重定义为ElenType型
struct LinkQ
{
	QueuePtr front,rear;  //设置队头队尾
};
//1.初始化
int Inithosp(LinkQ &Q)
{
	Q.front=new QNode;   //建立新的结点
	Q.rear=Q.front;   //队头队尾相等
	Q.front->next=NULL;   //队头指向空
	return OK;
}
//2.清空队
int ClQueue(LinkQ &Q)
{
	QueuePtr p,q;
	Q.rear=Q.front;   //清空后,队尾指向头指针
	p=Q.front->next;    //队头赋给p
	Q.front->next=NULL;   //队头指针指向空
	while(p!=Q.rear)   //如果队头不等于队尾
	{
		q=p;    //把p赋给q
		delete q;   //删除q
		p=p->next;   //p指向下一个,直到队头指向队尾
	}
	return OK;
}
//3.销毁
int DestroyQueue(LinkQ &Q)
{
	QueuePtr p;    //定义一个新的指针
	p=Q.front;    //p为空的头指针
	while(Q.front->next!=NULL)    //设置条件,如果头指针指向空,则证明已经销毁
	{
		Q.front=Q.front->next;     //把头指针给Q。front
		delete p;      //删除p。此时p为头的那个空的
		p=Q.front;    //再次使p为头
	}
	Q.rear=NULL;  //销毁后,尾为空,不指向队头
	return OK;
}
//4.插入
int EnQueue(LinkQ &Q,ET &e)
{
	QueuePtr p;  //定义
	p=new QNode;  //给p一个新的结点
	p->data=e;   //把e的值赋给p
	p->next=NULL;   //使p指向空,为尾指针
	Q.rear->next=p;   //让rear指向p
	Q.rear=p;   //再把p赋给rear,使rear永远在尾部
	return OK;
}
//5.出队
int DEQueue(LinkQ &Q,ET e)
{
	if(Q.front==Q.rear)
	{
		cout<<"该队为空,无法出队";
		return ERROR;
	}
	else
	{
		QueuePtr p;
	    p=Q.front->next;  //把头指针赋给p
	    e=p->data;    //队头元素赋给e
	    Q.front->next=p->next;  //让Q。front始终指向头部
	    if(Q.rear==p)   //如果刚好删的尾部
	    {
			Q.rear=Q.front;  //让尾指针指向头部
	    }
	    delete p;
        p=NULL;   //此时p不指向任何地方时要赋空
		return OK;
	}
}
//6.获取队顶元素
int Gethead(LinkQ Q,ET &e)
{
	QueuePtr p;
	if(Q.front->next!=NULL)
	{
		p=Q.front->next;   //p为队头
		e=p->data;   //把队头元素赋给e
		return OK;
	}
	else
	{
		cout<<"此队为空,队内无元素";
		return ERROR;
	}
}
//7.查询
int sert(LinkQ Q,ET &e,int c)
{
	
	int i;
	char name[20];
	cout<<"请输入姓名: ";
	cin>>name;
	QueuePtr p;
	if(Q.front->next!=NULL)
	{
		p=Q.front->next;  //p指向队头
        for(i=0;i<c;i++)   //遍历,此时c为当时的队伍长度,不是总长
	   {
		   e=p->data;   //把p的值给e
		   if(strcmp(name,e.name)==0)   //输入的名字和队里的名字比较
		   {
			   return OK;   //如果查到,结束程序
		   }
		   else
		   {
			   p=p->next;  //否则p指向下一个继续
		   }
		}
		cout<<"查无此人,请重新输入\n";
		return ERROR;
	}
	else
	{
		cout<<"此队为空,队内无元素";
		return OK;
	}
}
//8.队列长度
int LengthQueue(LinkQ Q)
{
	int i=0;
	QueuePtr p;
	p=Q.front;
	//第一次写的错误的,此时Q.front已经赋给p了,所以此时它没有值,while(Q.front!=Q.rear),注意p到底是谁
	while(p!=Q.rear)
	{
		i++;
		p=p->next;
	}
	return i;
}
//9.输出
void output(ET &e)
{
	cout<<e.data<<"\t"<<e.name<<"\t"<<e.sex<<"\t"<<e.age;
}
//10.遍历输出
void QueueTraverse(LinkQ Q)
{
	QueuePtr p;
	p=Q.front->next;
	while(p)   //while里面是p还是front!=rear取决于p是front还是front-》next的值,根据情况调整,跟长度类似
	{
		output(p->data);
		cout<<endl;
		p=p->next;
	}
}
//11.判空
int QueueEmpty(LinkQ Q)
{
	if(Q.front->next==NULL)
		return TRUE;
	else
		return FALSE;
}
//12.菜单
void domenu()
{
	cout<<"\n";
	cout<<"***************************************************************************\n";
	cout<<"\t------------欢迎进入医生查询界面!您可以进行以下操作------------\n";
	cout<<"\t---------------------------0.退出系统---------------------------\n";
	cout<<"\t-----------------------------1.上班-----------------------------\n";
	cout<<"\t---------------------------2.查看看诊---------------------------\n";
	cout<<"\t-----------------------3.请下一位患者就诊-----------------------\n";
	cout<<"\t-----------------------4.什么时候可以下班-----------------------\n";
	cout<<"***************************************************************************\n";
	cout<<"请输入你的选择: ";
}
void pamenu()
{
	cout<<"\n";
	cout<<"***************************************************************************\n";
	cout<<"\t--------------欢迎进入挂号界面!您可以进行以下操作--------------\n";
	cout<<"\t---------------------------0.退出系统---------------------------\n";
	cout<<"\t-----------------------1.前面还有几位病人-----------------------\n";
	cout<<"\t-----------------------------2.挂号-----------------------------\n";
	cout<<"***************************************************************************\n";
	cout<<"请输入你的选择: ";
}


#include "LinkQueue.h"
using namespace std;

/*******************************************************************
创建日期:2023-4 -7
修改调试记录:
1.在调用医生界面时一直不通过,通过把函数一个一个注释掉,看是哪个函数出问题,发现是length出问题
2.注意查询
3.注意如果就诊的是最后一个人,那么此时无人候诊
......
*******************************************************************
文件名:L_hospital.cpp
类描述:医院挂号
*******************************************************************/

int main()
{
	cout<<"220812049"<<"王灿灿 140min\n";	
	system("date /t");
	system("time /t");
	int num=1,flag=1,x;
	int choice,a,b,c,d;
	LinkQ q;
	ET e;
	while(flag)
	{
		cout<<"****************************如果您是医生,请输入1***************************\n";
		cout<<"*************************如果您是就诊患者,请输入2**************************\n";
		cout<<"请输入你的选择: ";
		cin>>choice;
		switch(choice)
		{
		case 1: domenu();
			cin>>a;
			switch(a)
			{
			case 0: break;
			case 1:
			cout<<"上班了,美好的一天开始了!\n请您输入今天打算看诊的最多人数: ";
			cin>>c;
			cout<<endl;
			Inithosp(q);  //医生上班后初始化
			break;
			case 2:
			if(QueueEmpty(q))
			{
				cout<<"目前没有正在排队的病人,可以休息一会呦!\n";
			}
			else
			{
				cout<<"目前还有"<<LengthQueue(q)<<"个患者等待就诊\n";
				cout<<"排号\t"<<"姓名\t"<<"性别\t"<<"年龄\n";
				QueueTraverse(q);
			}
			break;
			case 3:
			if(QueueEmpty(q))
			{
				cout<<"目前没有正在排队的病人,可以休息一会呦!\n";
			}
			else 
			{
				Gethead(q,e);  //获取队头元素的号码
				x=e.data;   //把队头排号赋给x
				cout<<"请"<<e.data<<"号患者"<<e.name<<"就诊"<<endl;
				if(LengthQueue(q)-1)   //如果队列中的人大于1,则需要输出候诊人数
				{
					DEQueue(q,e);   //队头出队看诊
					Gethead(q,e);   //出队后,获取候诊人信息
					cout<<"请"<<e.data<<"号患者"<<e.name<<"做好准备\n";
					cout<<"目前还有"<<LengthQueue(q)<<"个患者等待就诊\n";
					QueueTraverse(q);
				}
				else
				{
					DEQueue(q,e);  //如果队里只有一个人了,直接出队候诊
					cout<<"目前无人等候就诊\n";
			   }
			}
			break;
			case 4:
			if(!QueueEmpty(q))
			{
				cout<<"还有"<<LengthQueue(q)<<"个病人就结束了,请假看病不容易,看完后面的病人哦,再等一等!\n";
			}
			else
			{
				cout<<"今天共诊治病人"<<num-1<<"个,又是充实的一天!\n";
				cout<<"可以下班了!!!\n";
				DestroyQueue(q);
				flag=0;  //病人看完,下班
			}
			break;
	        }
			break;
		case 2: pamenu();
			cin>>b;
			switch(b)
			{
			case 0:  ;break;
			case 1:
				Gethead(q,e);  //此时若只有最后一人候诊,那么如果length-队头排号等于
				x=e.data;
				d=sert(q,e,LengthQueue(q));  //如果队内有输入的患者的名字,那么继续
				if(d)//注意这里c的位置是此时队内还有几人
				{
					if(e.data-x==-1)
				    {
						cout<<"已经轮到您了,请您就诊\n";
				    }
				    else
				    {
				        cout<<"您是第"<<e.data<<"号,目前您前面还有"<<(e.data-x)<<"个患者等待就诊,请耐心等候\n";
				    }
				}
				break;
			case 2:
				if(num<=c)
				{
					cout<<"请输入患者姓名:";
					cin>>e.name;
					cout<<"请输入患者性别:";
					cin>>e.sex;
					cout<<"请输入患者年龄:";
					cin>>e.age;
					e.data=num++;
					cout<<endl;
					EnQueue(q,e);
				}
				else
				{
					cout<<"对不起。号已挂满,请改天再来\n";
				}
				break;

			}

		}
		
	}
}


					

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

时光无声841

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

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

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

打赏作者

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

抵扣说明:

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

余额充值