一、實驗目的
通過隨機事件模擬進程隊列來加深對進程的創建和分類。
二、實驗內容
建立隨機事件鏈表(按發生時刻的先后次序鏈成帶頭結點的鏈表)。 事件類型Type是0到5之間的隨機數;事件發生時間OccuTime 為0到20之間的隨機數。
2.為每個類型(即type相同)事件分別建立隨機事件隊列 typedef struct qu { EVENT *front; EVENT *rear; int length;}QUEUE;
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 <stdio.h>
#include <stdlib.h>
#include <time.h>
#define TYPENUM 5 /*事件類型數*/
#define INTERV 10 /*兩個相鄰事件間的時間間隔上限*/
#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;i<q->length;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<TYPENUM;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<TYPENUM;j++) /*按類型逐一輸出事件隊列*/
{printf("q[%d]:(type,time)\n",j);
q_show(q[j]);
}
return 0;
}/*main*/