/*
文件名称: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;
}
}
}
}
医院排号,队列,包括输入病人信息,医生叫号,查询剩余病人情况,大家快来看,欢迎批评指正
最新推荐文章于 2024-06-15 16:46:40 发布