#include<stdio.h>
#include<stdlib.h>
#include<string>
#include<iostream>
#include <time.h>
using namespace std;
#define status int
#define ok 1
typedef struct patient
{
double arrive;
double treat;
}patient;
typedef struct Qnode
{
patient data;
struct Qnode *next;
}Qnode,*QueuePtr;
typedef struct
{
QueuePtr front;
QueuePtr rear;
}LinkQueue;
status InittQueue(LinkQueue &Q)
{
Q.front=Q.rear=new Qnode;
Q.front->next=NULL;
return ok;
}
status EnQueue(LinkQueue &Q,patient e)
{
QueuePtr p;
p=(QueuePtr)malloc(sizeof(Qnode));
p->data=e;
p->next=NULL;
Q.rear->next=p;
Q.rear=p;
return ok;
}
int display(LinkQueue Q)
{
QueuePtr p;
p=Q.front;
p->next;
int n=0;
while(p!=NULL)
{
n++;
p=p->next;
}
return n;
}
void Input(LinkQueue Q)
{
FILE* fp = fopen("病人模拟看病.txt", "w");
QueuePtr p;
p=Q.front;
p=p->next;
int m=1;
while (p != NULL)
{
fprintf(fp, "第%d位病人到达间隔时间%d分钟 医生看病时间%d分钟\n",m,(int)p->data.arrive, (int)p->data.treat);
p=p->next;
m++;
}
fclose(fp);
}
void jiuzhen(LinkQueue &Q)
{
srand((unsigned)time(NULL));
patient b;
b.arrive=0;
b.treat=rand()%9+1;
EnQueue(Q,b);
int n;
n=rand()%20;
int i=0;
while(i!=n)
{ patient b;
b.arrive=rand()%14+1;
b.treat=rand()%9+1;
EnQueue(Q,b);
i++;
}
}
void showxinxi(LinkQueue &Q)
{
QueuePtr p;
p=Q.front;
p = p->next;
double parr=0 ,sum,res;
printf("到达病人人数:%d\n",display(Q)-1) ;
for (int m=0; m<display(Q)-1; m++)
{
cout<<"第"<<m+1<<"位病人到达间隔时间"<<p->data.arrive<<"分钟 ";
cout<<"医生看病时间:"<<p->data.treat<<"分钟 ";
if(p->data.arrive-parr>0)
{
cout<<"医生等待时间:"<<p->data.arrive-parr<<"分钟"<<endl;
sum += p->data.arrive-parr;
}
else
{
cout<<"病人等待时间:"<<parr-p->data.arrive<<"分钟"<<endl;
res+=parr-p->data.arrive;
}
parr=p->data.treat;
p = p->next;
}
}
void doctorwait(LinkQueue Q)
{
QueuePtr p;
p=Q.front;
p = p->next;
double parr=0,sum=0;
for (int m=0; m<display(Q)-1; m++)
{
if(p->data.arrive-parr>0)
sum=sum+p->data.arrive-parr;
parr=p->data.treat;
p = p->next;
}
cout<<"医生总等待时间"<<sum<<"分钟"<<endl;
}
void patientwait(LinkQueue Q)
{
QueuePtr p;
p=Q.front;
p = p->next;
double parr=0,sum=0;
for (int m=0; m<display(Q)-1; m++)
{
if(p->data.arrive-parr<0)
sum=sum+parr-p->data.arrive;
parr=p->data.treat;
p = p->next;
}
cout<<"病人平均等待时间"<<sum/(display(Q)-1)<<"分钟"<<endl;
}
int main()
{
LinkQueue a;
InittQueue(a);
cout<<" -------------->1.就诊 <----------------------"<<endl;
cout<<" -------------->2.就诊信息查询<----------------"<<endl;
cout<<" -------------->3:病人平均等待时间<------------"<<endl;
cout<<" -------------->4:医生总等待时间<-------------"<<endl;
cout<<" -------------->5.打印输出就诊信息 <------------"<<endl;
cout<<" -------------->6.下班 <----------------------- "<<endl;
int x ;
while(1)
{
scanf("%d",&x);
switch(x)
{
case(1):
{
jiuzhen(a);
cout<<"就诊完成"<<endl;
break;
}
case(2):
{
showxinxi(a);
break;
}
case(3):
{
patientwait(a);
break;
}
case(4):
{
doctorwait(a);
break;
}
case(5):
{
Input(a);
cout<<"打印完成,内容以存放至 病人模拟看病.txt"<<endl;
break;
}
case(6):
{
printf("要下班吃饭咯");
exit(0);
}
}
}
Input(a);
}