1. 引言
本文主要讲解一个队列和线性表的例子——离散事件模拟。
2. 离散事件模拟——银行业务模拟
#include "ds.h"
#define FILE_TEST
// 银行业务模拟
#define Qu 4 // 客户队列数
#define Khjg 5 // 两相邻到达的客户的时间间隔最大值
#define Blsj 30 // 每个客户办理业务的时间最大值
typedef struct
{
int OccurTime; // 事件发生的时间
int NType; // 事件类型, Qu表示到达事件,0至Qu-1表示Qu个窗口的离开事件
}Event, ElemType; // 事件类型,有序链表LinkList的数据元素类型
typedef struct LNode
{
ElemType data;
LNode *next;
}LNode, *Link, *Position;;
typedef struct
{
Link head, tail;
int len;
}LinkList;
typedef LinkList EventList; //事件链表指针类型,定义为有序链表
typedef struct
{
int ArrivalTime; // 到达时间
int Duration; // 办理事件
}QElemType; // 定义队列的数据元素类型
// 单链队列--队列的链式存储结构
typedef struct QNode
{
QElemType data;
QNode *next;
}*QueuePtr;
typedef struct
{
QueuePtr front, rear; // 队头、队尾指针
}LinkQueue;
// 程序中用到得主要变量(全局)
EventList ev; // 事件表头指针
Event en, et; // 事件, 临时变量
#ifdef FILE_TEST
FILE *fp; // 文件类型指针,用于指向b.txt, a,txt
#endif
long int TotalTime = 0; // 累计客户逗留时间(初值为0)
int CloseTime, CustomerNum = 0; // 银行营业时间(单位为分),客户数(初值为0)
void MakeNode(Link &p, ElemType e);
void FreeNode(Link &p);
void InitList(LinkList &L);
void ClearList(LinkList &L);
void DestroyList(LinkList &L);
// h指向L的一个结点,把h当做头结点,将s所指结点插入在第一个结点之前, 形参增加L,因为需修改L
void InsFirst(LinkList &L,Link h,Link s);
// h指向L的一个结点,把h当做头结点,删除链表中的第一个结点并以q返回。
// 若链表为空(h指向尾结点),q=NULL,返回FALSE
Status DelFirst(LinkList &L, Link h, Link &q);
// 将指针s(s->data为第一个数据元素)所指(彼此以指针相链,以NULL结尾)的
// 一串结点链接在线性链表L的最后一个结点之后,并改变链表L的尾指针指向新的尾结点
void Append(LinkList