69,369
社区成员
发帖
与我相关
我的任务
分享
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef struct QNode{ //修改结构体的定义,结构体含有两个数据 intertime和occurtime
double intertime;
double occurtime;
struct QNode *next;
}QNode,*Queueptr;
typedef struct{ //单向链式队列
Queueptr front; //队头指针 队头指针,没有数据域
Queueptr rear; //队尾指针
}LinkQueue;
int InitQueue(LinkQueue &Q)//队列初始化
{
Q.front=Q.rear=(Queueptr)malloc(sizeof(QNode));
if(!Q.front) exit(OVERFLOW);
Q.front->next=NULL;
return OK;
}
int EnQueue(LinkQueue &Q,double a,double b)//插入队尾元素a,b
{
Queueptr p;
p=(Queueptr)malloc(sizeof(QNode));
if(!p)
exit(OVERFLOW);
p->intertime=a;
p->occurtime=b;
p->next=NULL;
Q.rear->next=p;
Q.rear=p;
return OK;
}
int DeQueue(LinkQueue &Q)//删除队头元素
{
Queueptr p;
if(Q.front==Q.rear)
return ERROR;
p=Q.front->next;
Q.front->next=p->next;
if(Q.rear==p) Q.rear=Q.front;
free(p);
return OK;
}
double waittime_Queue(LinkQueue &Q) //客户等待时间计算
{
double waittime = 0;//这里要初始化。。
Queueptr q;
double clock=0,num=0;
while(Q.front!=Q.rear)
{
q=Q.front->next;
if((q->intertime<clock)||(num==0))
{
num++; //num只是为了设置第一个数做特殊处理,因为第一个数据是不存在等待时间的
if(num==1)
{
clock=q->intertime+q->occurtime;
}
else
{
waittime=waittime+clock-(q->intertime);
clock=clock+q->occurtime;
}
}
DeQueue(Q);
}
return waittime;
}
int chudui(LinkQueue &Q)
{
Queueptr q;
printf("The Queue is:\n");
q=Q.front->next;
//while((Q.rear-q)>=0) 遍历链表不能这样的。。这里会挂掉。。
while(q)
{
printf("%lf %lf\n",q->intertime,q->occurtime);
q = q->next;//
}
return OK;
}
int main()
{
LinkQueue Q;
InitQueue(Q);
int n,m;
double intertime,occurtime,aver;
scanf("%d",&n);
m=n;
while(n--)
{
scanf("%lf%lf",&intertime,&occurtime);
//printf("%lf %lf\n",intertime,occurtime); //检验输入是否有误
EnQueue(Q,intertime,occurtime); //检验入队列的正确性
//printf("%lf\n",waittime_Queue(Q));
chudui(Q); //检验队列的正确性
}
aver=waittime_Queue(Q)/m;
printf("%.2lf\n",aver);
return 0;
}