1、void HRRN();PNODE priorit(PNODE pHead);void do_work_1(PNODE pHead,int *w_finish_time,int i);int main() int choice; /设置选择数 showmenu(); /显示菜单 scanf(%d,&choice); while(choice != 0) /选择算法 switch(choice) case 1 : printf(您选择的是先来先服务算法:n); FCFS(); break; case 2 :您选择的是短作业优先算法: SJF(); case 3 :您选择的是高响应比优先调度算法n
2、 HRRN(); default:请重新选择! printf(下面是菜单,请继续,或者按0退出 showmenu(); scanf( printf(感谢您使用本系统,再见! return 0;void FCFS() int j,k; int w_rel_time5; int w_finish_time5; float rel_time = 0; struct work temp; int i; struct work w5; srand(time(0); for(i=0;i5;i+) wi.id = rand()%10; wi.arrive_time = rand()%10; wi.work_
3、time = rand()%10+1; for(j=0;jj+)第%d个作业的编号是:%dt,j+1,wj.id);第%d个作业到达时间:,j+1,wj.arrive_time);第%d个作业服务时间:,j+1,wj.work_time); for(j=1; for(k=0;k wk+1.arrive_time) temp = wk; wk = wk+1; wk+1 = temp; w_finish_time0 = w0.arrive_time + w0.work_time; for(j=0; if(w_finish_timej pNext = NULL; /定义该链表有头结点,且第一个节点初
4、始化为空10; PNODE pNew = (PNODE)malloc(sizeof(NODE); if (NULL = pNew) exit(-1); pNew-s_work.id = rand()%100;s_work.arrive_time = rand()%10;s_work.work_time = rand()%10+1; pTail-pNext = pNew; pTail = pNew; PNODE p = pHead-pNext; /p指向第一个节点 while (NULL != p),j+1,p-s_work.id);s_work.arrive_time);s_work.work
5、_time); p = p- j+; p = pHead- PNODE q = p; /p,q都指向第一个节点 p = p- while(p != NULL) if(p-s_work.arrive_time s_work.arrive_time) q = p; PNODE r = pHead- /r也指向第一个节点 int cnt = 0; /记录所有节点数据域中到达时间最短且相等的个数 while(r! if( r-s_work.arrive_time = q-s_work.arrive_time ) cnt+; r = r-= NULL) /在相等到达时间的作业中找服务时间最短的作业 if
6、(cnt 1) if( p- if( p-s_work.work_time else p =NULL; /确定q所指作业最先到达且服务时间最短 w_finish_time0 = q-s_work.arrive_time + q-s_work.work_time; w_rel_time0 = w_finish_time0 - q-s_work.arrive_time;第1个系统执行的作业到达时间:,q-%d n,w_finish_time0);,w_rel_time0); p = pHead; /寻找q的前一个节点,方便删掉q节点 while( p-pNext != q ) p-pNext =
7、q- free(q); q = NULL;9&!Is_empty(pHead); 现在系统还剩%d个作业!,cnt_work(pHead); q = do_work(pHead,w_finish_time,i); show(w_finish_time,i,q,w_rel_time); p = pHead; while( p- p = p- p- free(q); q = NULL; rel_time += w_rel_timej;,rel_time/10);bool Is_empty(PNODE pHead) /判断作业是否做完 PNODE p; int len = 0; len+; if(l
8、en = 0) return true; /当没有作业时,返回为真 else return false;int cnt_work(PNODE pHead) /计算当前还剩多少作业 return len;PNODE do_work(PNODE pHead,int *w_finish_time,int i) PNODE p,q; /计数器清0,计算当前作业完成时,系统中有多少个作业已经到达= NULL) if( p-= w_finish_timei ) cnt +; q = p; /q指向当前到达时间小于刚刚完成的作业,但不一定是服务时间最短的(如果有的话)系统中有%d个作业在当前作业完成时已经到
9、达!,cnt); if(cnt1) /执行此次判断后,q现在指向所有条件都满足的作业(如果有的话) q = p; p = p- else else /当前作业完成时,没有作业到达的情况 /用q来接收最先到达的,用p来遍历 while( p != NULL )s_work.arrive_time w_finish_timei+1 = w_finish_timei + q- return q;void show(int *w_finish_time,int i,PNODE q,int *w_rel_time) w_rel_timei+1 = w_finish_timei+1 - q-,i+2,q-
10、%dn,w_finish_timei+1);,w_rel_timei+1);void showmenu()*n请选择你要执行的命令: n1:先来先服务算法n2:短作业优先算法n3: 高响应比优先算法n0: 退出菜单nvoid HRRN() /计算优先权i+) /定义了十个进程 /已经找到并执行第一个进程,执行完之后又将其删除了 do_work_1(pHead,w_finish_time,i); q = priorit(pHead);void do_work_1(PNODE pHead,int *w_finish_time,int i) /q指向当前到达时间小于刚刚完成的作业,但有可能有另外几个进程也已经到达了,所以要进行下面的判断pNe