ready=ready->next; run->state='R'; }
void create2(char alg) { PCB *p; int i;
ready=NULL; run=NULL; finish=NULL; for(i=0;i p=(PCB *)malloc(sizeof(PCB)); printf(\进程名:\ scanf(\ printf(\到达时间:\ scanf(\ printf(\需要时间:\ scanf(\ p->starttime=0; p->finishtime=0; p->state='W'; if(ready!=NULL) insert2(p);//将新进程插入就绪队列 else { p->next=ready;//创建就绪队列的第一个 ready=p; } } system(\ printf(\ 先来先服务算法结果输出\\n\ printf(\ prt(alg); } void priority(char alg) { while(run!=NULL) //当运行队列不空时,有进程正在运行 { run->cputime=run->cputime+1; run->needtime=run->needtime-1; run->prio=run->prio-1; //每运行一次优先数-1 if(run->prio<0) //如果优先数减到小于0,则转换成0 run->prio=0; 16 if(run->needtime==0) //如果所需时间为0,即完成,将其插入完成队列 { run->next=finish; finish=run; run->state='F'; //置状态为完成态 run=NULL; //运行队列头指针为空 if(ready!=NULL) //如果就绪队列不空 firstin(); //将就绪对列的第一个进程投入运行 } else //没有运行完同时优先数不是最大,则将其变为就绪态插入到就绪队列 if((ready!=NULL)&&(run->prio void FCFS(char alg) { int time=0;//系统时间从0开始 do{ run=ready;//就绪序列的第一个进程放入run队列进行执行 run->state='R';//进程开始执行 ready=ready->next;//指向下一个 time=run->arrivetime>time? run->arrivetime:time; run->starttime=time;//进程开始 prt(alg);//显示正在执行的进程 time=time+run->servicetime;//计算下个进程最小可开始时间 run->finishtime=time;//进程结束时间 run->state='F';//结束状态标识 prt(alg);//进程结束再显示 run->next=finish; finish=run;//进程结束放入结束队列 run=NULL; }while(ready!=NULL); } /*菜单显示函数*/ void Menu() { system(\ printf(\━━━━━━━━━━━━━━━━━━━━━━+\\n\ printf(\ 进程调度算法 | \\n\ printf(\━━━━━━━━━━━━━━━━━━━━━━| \\n\ 17 printf(\ | \\n\ printf(\ [1]优先数算法 | \\n\ printf(\ | \\n\ printf(\ [2]先来先服务算法 | \\n\ printf(\ | \\n\ printf(\ [3]退出系统 | \\n\ printf(\ | \\n\ printf(\━━━━━━━━━━━━━━━━━━━━━━| \\n\ printf(\ By:周敏健 | \\n\ printf(\━━━━━━━━━━━━━━━━━━━━━━+\\n\ printf(\请输入编号:\} int main() { char algo; //接收算法编号 char mainmenu;//判断是否继续 srand((unsigned)time(NULL)); system(\清屏 do{ Menu();//显示菜单 scanf(\输入算法编号 switch(algo) { case 1: system(\ printf(\您选择的是优先数算法\\n\ printf(\请输入进程数目:\ scanf(\输入进程数 create1(algo); //创建队列 priority(algo);//优先数 break; case 2: system(\ printf(\您选择的是先来先服务算法\\n\ printf(\请输入进程数目:\ scanf(\输入进程个数 create2(algo);//创建队列 FCFS(algo);//先来先服务 break; case 3: printf(\再见! \\n\ exit(0); break; default: 18 printf(\输入有误\\n\ break; } printf(\是否继续操作(Y/N) \ fflush(stdin); mainmenu=getchar(); } while(mainmenu=='y'||mainmenu=='Y'); return 0; } 19