html 模拟队列,操作系统实验一(用随机事件模拟进程队列)

一、实验目的

通过随机事件模拟进程队列来加深对进程的创建和分类。

二、实验内容

建立随机事件链表(按发生时刻的先后次序链成带头结点的链表)。 事件类型Type是0到5之间的随机数;事件发生时间OccuTime 为0到20之间的随机数。

37918a8e30249935d99216de2d999b84.png

2.为每个类型(即type相同)事件分别建立随机事件队列 typedef struct qu { EVENT  *front; EVENT  *rear; int length;}QUEUE;

09fa011105666b6c7466334f01a8d2c9.png

3.分别输出事件链表和事件队列

附:程序中需编写的相关函数说明:

void l_insert(EVENT*head,EVENT e):

在头结点为head的事件链表中,按照occuTime的大小递增顺序插入结点evoid q_append(QUEUE *q,EVENT e):

将事件e追加到对应的type事件队列的队尾void l_show(EVENT *p):

输出事件链表void q_show(QUEUE *q):

输出各类型队列

实验代码:

#include

#include

#include

#define TYPENUM5/*事件类型数*/

#define INTERV10 /*两个相邻事件间的时间间隔上限*/

#define closeTime 60/*产生事件的截止时间*/

typedef struct ev{

int Type;/*事件类型*/

int occuTime;/*事件的发生时刻*/

struct ev *next;/*指向下一事件的指针*/

}EVENT;

typedef struct qu {

EVENT *front; /*指向队首*/

EVENT *rear; /*指向队尾*/

int length; /*队长度*/

} QUEUE;

void l_insert(EVENT *head,EVENT e)/*链表插入操作*/

{ EVENT *p,*tmp;

p=(EVENT*)malloc(sizeof(EVENT));/*申请结点空间*/

*p=e;

p->next=NULL;

tmp=head;

while(tmp->next!=NULL&&tmp->next->occuTime<=p->occuTime)/*找插入位置*/

tmp=tmp->next;

p->next=tmp->next; /*插入*/

tmp->next=p;

}

void q_append(QUEUE *q,EVENT e) /*入队操作*/

{EVENT *p;

p=(EVENT *)malloc(sizeof(EVENT)); /* 申请空间*/

*p=e;

p->next=NULL;

if(q->front==NULL) /*若队空,则作为队的唯一结点*/

q->front=q->rear=p;

else { /*否则,进入队尾*/

q->rear->next=p; q->rear=p;

}

q->length++; /*队长度增长1*/

}

void l_show(EVENT *p)/*输出链表*/

{ int i=0;

p=p->next;

while(p!=NULL){

printf("(%d,%d) ",p->Type,p->occuTime);

i++;

if(i%5==0)

printf("\n");

p=p->next;

}

printf("\n");

}

void q_show(QUEUE *q) /*输出队列*/

{ int i;

EVENT *p;

if(q->length==0) printf("queue is empty!");

else {

p=q->front;

for(i=0;ilength;i++)

{ printf("(%d,%d) ",p->Type,p->occuTime);

if((i+1)%5==0)

printf("\n");

p=p->next;

}/*end for */

} /*end else*/

printf("\n");

}/*q_show*/

int main()

{ int type,j;

int occurtime=0;/*事件发生时刻,初始为0*/

int gap=0; /*两个事件之间的时间间隔*/

long t;

EVENT ev1,*head=(EVENT *)malloc(sizeof(EVENT));/*表头*/

QUEUE *q[TYPENUM];/*队列指针数组*/

head->next=NULL;/*链表上只有一个头结点*/

for(j=0;j

{ q[j]=(QUEUE *)malloc(sizeof(QUEUE));

q[j]->front=q[j]->rear=NULL;

q[j]->length=0;

}

t=time(NULL);/*取时钟时间*/

srand(t);/*初始化随机数发生器*/

while(occurtime+gap<=closeTime)

{/*产生随机事件,分别插入链表和队列*/

type=rand()%TYPENUM;/*产生事件类型*/

ev1.Type=type;/*存入事件类型*/

occurtime+=gap;/*计算事件发生时刻*/

ev1.occuTime=occurtime;/*存入事件发生时刻*/

ev1.next=NULL;

gap=rand()%INTERV+1;/*产生下一事件发生的时间间隔*/

l_insert(head,ev1);/*按发生时刻先后插入事件链表*/

q_append(q[type],ev1);/*按事件类型进队列*/

}

printf("L:(type,time)\n");

l_show(head); /*输出事件链表*/

printf("\n");

for(j=0;j

{printf("q[%d]:(type,time)\n",j);

q_show(q[j]);

}

return 0;

}/*main*/

标签:tmp,操作系统,队列,next,链表,int,随机,EVENT,事件

来源: https://www.cnblogs.com/byczyz/p/12733150.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值