银行模拟程序,编译没有错误,为何无法执行。。。求助
#include"c1.h"#include<time.h>
#include<time.h>
typedef struct LNode{////////////////事件练表的元素类型
int OccurTime;
int NType;
LNode *next;
}Event,ElemType,*xx;
typedef struct Head /////////////////此时要是这个head名字和LinkList一样,则出错
{
ElemType *head;
ElemType *tail;
int len;
}LinkList;
typedef struct QNode{/////////////////////////////////队列的元素类型
int Arrivetime;
int Duration;
QNode *next;
}QElemType;
struct LinkQueue///////////////////////////
{
QElemType *front;
QElemType *rear;
};
/////////////////////////////////////
typedef LinkList EvenList;
EvenList ev;//////////////////////////
Event en;
LinkQueue q[5];
QElemType Customer;
int TotalTime,CustomerNum,CloseTime;
///////////////////////////////////////
Status InitList(LinkList &L)//////////////////////////////////////////// 构造一个空的线性链表
{
ElemType *p;
p=(ElemType*)malloc(sizeof(LNode)); // 生成头结点
if(p)
{
p->next=NULL;
L.head=L.tail=p;
L.len=0;
return OK;
}
else
return ERROR;
}
//////////////////////////////////////////////////////////////////////初始化一个队列
Status InitQueue(LinkQueue &Q)
{
Q.front=Q.rear=(QElemType*)malloc(sizeof(QNode));
if(!(Q.front))
exit(OVERFLOW);
Q.front->next=NULL;
return OK;
}
///////////////////////////////////////////////////////
int cmp(Event a,Event b)
{
if(a.OccurTime==b.OccurTime)
return 0;
else
return (a.OccurTime-b.OccurTime)/abs(a.OccurTime-b.OccurTime);
}
////////////////////////////////////////////////////////此处是声明一个函数的入后点
void OrderInsert(LinkList &L,ElemType en,int (*cmp)(ElemType ,ElemType ))// 已知L为有序线性链表,将元素e按非降序插入在L中///////调试次函数形式的作用
{
ElemType *o,*p,*q;
q=L.head;
p=q->next;/////////////p指向第一个元素节点
while(p!=NULL&& cmp(*p,en)<0) // p不是表尾且元素值小于e、、、、、p前面加一个*是指针的形式转化成结构
{
q=p;
p=p->next;
}
o=(ElemType*)malloc(sizeof(LNode)); // 生成结点
o->OccurTime=en.OccurTime;
o->NType=en.NType;// 赋值
q->next=o; // 插入
o->next=p;
L.len++; // 表长加1
if(!p) // 插在表尾
L.tail=o; // 修改尾结点
}
/////////////////////////////////////
int ListEmpty(EvenList ev)
{
int r;
r=ev.len;
if(r==0)///////////////////////////////////////////////////注意此处若r!==1时则出现语法错误
return 0;
else
return 1;
}
/////////////////////////////////////////////////////
xx GetHead(LinkList L)////////////////////////相当与说这个函数返回的类型是一个指向事件元素的指针值,,,到下面以个函数时相当于H是指向头节点的指针
{
return L.head;
}
///////////////////////////////////////////////////DelFirst(ev,GetHead(ev),q)
void DelFirst(LinkList &L,xx h,xx &q)
{ // 把h当做头结点,删除链表中的第一个结点并以q返回。
q=h->next;/////////////////////////////////////////此时的q指向第一个元素节点
if(q)
{
h->next=q->next;/////////////////////将第一个元素节点删除,,,相当于将头结点的指针的下一个元素,进行了修改
if(!h->next) /////////////////////// 如果链表中只有一个元素,那么需要将尾节点的位置进行修改
L.tail=h;
L.len--;
}
}
///////////////////////////////////////////////////////////////////////
void Random(int &durtime,int &intertime)
{
srand(time(0));
durtime=rand()%30+1;
intertime=rand()%5+1;
}
//////////////////////////////////////////////////////
int QueueLength(LinkQueue Q)
{
int i=0;
QElemType *p;
p=Q.front;
while(Q.rear!=p)
{
i++;
p=p->next;
}
return i;
}
////////////////////////////////////////////////
////////////////////////////////////////////
int mininum()
{
int j,a[5],k;
for(j=1;j<=4;j++)
{
a[j]=QueueLength(q[j]);
}
k=1;
for(j=2;j<=4;j++)
{
if(a[j]<a[1])
{
a[1]=a[j];
k=j;
}
return j;
}
}
///////////////////////////////////////////////////
void EnQueue(LinkQueue &Q,QElemType e)
{
QElemType *p;
if(!(p=(QElemType*)malloc(sizeof(QNode))))
exit(OVERFLOW);
p->Arrivetime=e.Arrivetime;
p->Duration=e.Duration;
p->next=NULL;
Q.rear->next=p;
Q.rear=p;
}
///////////////////////////////////////////////////////
Status DeQueue(LinkQueue &Q,QElemType &e)
{
QElemType *p;
if(Q.front==Q.rear)
return ERROR;
p=Q.front->next;
Q.front->next=p->next;
e.Arrivetime=p->Arrivetime;
e.Duration=p->Duration;
if(Q.rear==p)
Q.rear=Q.front;
free(p);
return OK;
}
//////////////////////////////////////////////////////
Status GetHead0(LinkQueue Q,QElemType &e)
{
QElemType *p;
if(Q.front==Q.rear)
return ERROR;
p=Q.front->next;
e.Arrivetime=p->Arrivetime;
e.Duration=p->Duration;
return OK;
}
/////////////////////////////////////////////////////银行模拟实验的初始化
void OpenForDay()
{
int i;
TotalTime=0;CustomerNum=0;
InitList(ev);
en.OccurTime=0;en.NType=0;
OrderInsert(ev,en,cmp);
for(i=1;i<=4;++i)
{
InitQueue(q[i]);
}
}
////////////////////////////////////////////////////////////////////////en.OccurTime=en.OccurTime+intertime;
void CustomerArrived()
{
Event en0,en1;
int t,durtime,intertime,i;
++CustomerNum;
Random(durtime,intertime);
en0.OccurTime=en.OccurTime+intertime;
en0.NType=0;
t=en.OccurTime+intertime;//////////////////////////当前时刻加上随机时刻之后是下一个事件发生的时刻。插入时间表Customer.Arrivetime=
if(t<CloseTime)
OrderInsert(ev,en0,cmp);
i=mininum();
Customer.Arrivetime=en0.OccurTime;
Customer.Duration=durtime;
EnQueue(q[i],Customer);
if(QueueLength(q[i])==1)
en1.OccurTime=en.OccurTime+durtime;
en1.NType=i;
OrderInsert(ev,en1,cmp);
}
////////////////////////////////////
void CustomerDeparture()
{
Event et;
int i;
i=en.NType;
DeQueue(q[i],Customer);
TotalTime+=en.OccurTime-Customer.Arrivetime;
if(!QueueLength(q[i]))
{
GetHead0(q[i],Customer);
et.OccurTime=en.OccurTime+Customer.Duration;
et.NType=i;
OrderInsert(ev,et,cmp);
}
}
/////////////////////////////////
void main()
{
xx m;
xx g;
scanf("%d",&CloseTime);
OpenForDay();
while(ListEmpty(ev))
{
m=GetHead(ev);/////此时的m返回的是头结点的指针
DelFirst(ev,m,g); en=*g;//////////////注意变量和指向变量的指针之间的转化问题,,,此时已经可以确定结点不畏孔
if(en.NType==0)///////////////////////在此之前的程序没有任何问题
CustomerArrived();
else
CustomerDeparture();
}
printf(" %f\n",TotalTime/CustomerNum);
}
c1.h这个头文件里面是这些
// c1.h (程序名)
#include<string.h>
#include<ctype.h>
#include<malloc.h> // malloc()等
#include<limits.h> // INT_MAX等
#include<stdio.h> // EOF(=^Z或F6),NULL
#include<stdlib.h> // atoi()
#include<io.h> // eof()
#include<math.h> // floor(),ceil(),abs()
#include<process.h> // exit()
#include<iostream.h> // cout,cin
// 函数结果状态代码
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
// #define OVERFLOW -2 因为在math.h中已定义OVERFLOW的值为3,故去掉此行
typedef int Status; // Status是函数的类型,其值是函数结果状态代码,如OK等
typedef int Boolean; // Boolean是布尔类型,其值是TRUE或FALSE