离散事件模拟——银行队列问题//数据结构作业

//银行——离散事件模拟
#include<stdio.h>
#include<stdlib.h>

struct event{
    int type,occurtime,money;//type为0,到达;为1,离开窗口;occurtime为0到600;
}ev1,ev2;
struct eventnode{
    int type;
    int occurtime;
    int money;
    struct eventnode *next;
} *evlist;
struct queuenode{
    int money,duringtime,arrivetime;//arrivetime用于最后计算总时间
    struct queuenode *next;
};
struct Queue{
    struct queuenode *front;
    struct queuenode *rear;
}queue1,queue2;
int totaltime,customernum,closetime,timemark,totalmoney;



void evlistinsert(struct event temp){
    struct eventnode *p1,*p2,*p3;
    p1=(struct eventnode *)malloc(sizeof(struct eventnode));
    p1->type=temp.type;
    p1->occurtime=temp.occurtime;
    p1->money=temp.money;
    p1->next=NULL;
    if(!evlist){
        evlist=p1;
    }
    else{
        p2=evlist;
    while(p2->next)p2=p2->next;
    p2->next=p1;
    }

}

void arrive(){
    int duringtime,intertime;
    ++customernum;

    duringtime=rand()%30+1;
    if(ev1.money+totalmoney>=0){//能满足
        struct queuenode *p;
        p=(struct queuenode*)malloc(sizeof(struct queuenode));
        queue1.rear->next=p;
        queue1.rear=p;
        p->next=NULL;
        p->money=ev1.money;
        p->duringtime=duringtime;
        p->arrivetime=ev1.occurtime;//加入队列1
        printf("顾客%d\n到达时间:%d\n业务用时:%d\n金额:%d\n",customernum,ev1.occurtime,duringtime,ev1.money);

        ev2.type=1;
        ev2.occurtime=timemark+duringtime;
        timemark=ev2.occurtime;
        ev2.money=ev1.money;
        evlistinsert(ev2);//离开事件插入事件表
        totaltime+=ev2.occurtime-ev1.occurtime;

    }
    else{
        struct queuenode *p;
        p=(struct queuenode *)malloc(sizeof(struct queuenode));
        queue2.rear->next=p;
        queue2.rear=p;
        p->next=NULL;
        p->money=ev1.money;
        p->duringtime=duringtime;
        p->arrivetime=ev1.occurtime;//加入队列2
        printf("顾客%d\n到达时间:%d\n欲交易金额:%d,不能满足,进入队列2\n",customernum,ev1.occurtime,ev1.money);
        printf("-----------------------------------------------\n");
    }


    intertime=rand()%10+1;
    ev2.type=0;
    ev2.occurtime=ev1.occurtime+intertime;
    ev2.money=rand()%10000-5000;
    if(ev2.occurtime>timemark)timemark=ev2.occurtime;
    if(ev2.occurtime<closetime&&timemark<closetime)evlistinsert(ev2);//下一个顾客


}

void leave(){
    struct queuenode *p;
    if(ev1.type==1){
        p=queue1.front->next;
        queue1.front->next=p->next;
        if(!queue1.front->next)queue1.rear=queue1.front;
        free(p);//删除队列1头的顾客
        totalmoney+=ev1.money;
        printf("离开时间:%d分钟\n银行金额:%d\n",ev1.occurtime,totalmoney);
        printf("-----------------------------------------------\n");

    }
    if(ev1.money<0)return;

    struct queuenode *temp=queue2.front->next;
    if(!temp)return;
    int k=0,flag;
    while(temp!=NULL){
        k++;
        temp=temp->next;
    }
    flag=k;
    k=0;
    int temptime=ev1.occurtime,tempmoney;
    temp=queue2.front->next;
    while(k<flag){
        if(totalmoney+temp->money>=0){
            tempmoney=temp->money;
            totalmoney+=temp->money;
            temptime+=temp->duringtime;
            totaltime+=temptime-temp->arrivetime;
            queue2.front->next=temp->next;
            if(!queue2.front->next)queue2.rear=queue2.front;
            temp=queue2.front->next;
            free(p);//删除队列2头的顾客
            printf("队列2有顾客离开了,时间为%d,交易金额为%d,银行金额为%d\n",temptime,tempmoney,totalmoney);
            printf("-----------------------------------------------\n");
        }
        else if(temp->next){
                queue2.front->next=temp->next;
                temp->next=NULL;
                queue2.rear->next=temp;
                queue2.rear=temp;
                temp=queue2.front->next;//队头掉到队尾
                }
        k++;
        }
        if(temptime>timemark)timemark=temptime;
    }



void openforday(){


    queue1.front=(struct queuenode *)malloc(sizeof(struct queuenode));
    queue1.rear=queue1.front;
    queue1.rear->next=NULL;
    queue2.front=(struct queuenode *)malloc(sizeof(struct queuenode));
    queue2.rear=queue2.front;
    queue2.rear->next=NULL;


    totaltime=0;
    customernum=0;
    totalmoney=1000;
    closetime=1000;

    evlist=(struct eventnode*)malloc(sizeof(struct eventnode));
    evlist->occurtime=0;
    evlist->type=0;
    evlist->money=5000;

}

int main(){
    struct eventnode *p;
        srand(time(NULL));
    openforday();//初始化

    while(evlist){
        ev1.occurtime=evlist->occurtime;
        ev1.type=evlist->type;
        ev1.money=evlist->money;

        p=evlist;
        evlist=evlist->next;
        free(p);

        if(ev1.type==0)arrive();
        else leave();

    }
    struct queuenode *temp=queue2.front->next;
    while(temp){
        totaltime+=closetime-temp->arrivetime;
        temp=temp->next;
    }
    printf("The average time is %f\n",(float)totaltime/customernum);
}

博客地址转至https://xisynotz.xyz

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值