编辑: wtshxd | 2019-01-06 |
0 struct jcb { char name[10];
/*作业名*/ int ntime;
/*所需时间*/ int htime;
/*提交时间*/ int starttime;
/*作业开始运行时刻*/ int zhouzhuan;
/*周转时间*/ float daiquan;
/*带权周转时间*/ float xiangyingbi;
/*响应比*/ int super;
/*优先级*/ int flat;
/*是否被复制的标志位*/ char states;
/*作业状态,运行或者等待*/ struct jcb* next;
}*ready=NULL;
typedef struct jcb JCB;
JCB *head=NULL;
JCB *headFCFS=NULL;
JCB *headSJF=NULL;
JCB *headHRN=NULL;
JCB *headSUPER=NULL;
int clock=0;
/*定义计时时钟*/ int FCFS=0,SJF=0,HRN=0,SUPER=0;
/*定义四种算法是否选用过的标志,用于当选用过所有算法时打印出对比数据*/ int select;
/*算法选择*/ int lengh=0;
/*作业数量*/ void input();
void connect();
void myprintf();
void printftable();
void sortFCFS();
void sortSJF();
void sortHRN();
void sortSUPER();
void choose();
void execute(JCB *p);
void copynode(JCB *p1,JCB *p2);
void printffinish(JCB *p);
JCB *delenode(JCB *ph,JCB *p);
void printfall();
void destroy(JCB *p);
void input() { int i;
JCB *p;
printf( \n\n请输入作业数: );
scanf( %d ,&
lengh);
if(lenghnext);
printf( \n=n );
printf( 您选择的是: 短作业优先作业调度算法 \n\n );
printfall(headSJF->
next);
printf(n );
getch();
choose();
break;
} case 3: { HRN=1;
sortHRN();
printf( \n=n );
printf( 您选择的是: 高响应比作业调度算法\n\n );
printfall(headHRN->
next);
printf(n );
getch();
choose();
break;
} case 4: { SUPER=1;
sortSUPER();
execute(headSUPER->
next);
printf( \n=n );
printf( 您选择的是: 高优先权优先作业调度算法\n\n );
printfall(headSUPER->
next);
printf(n );
getch();
choose();
break;
} case 0: { exit(0);
} default: { choose();
} } } void sortFCFS()/*先来先服务*/ { JCB *pt=NULL,*ph=NULL,*p=NULL,*ps=NULL;
ph=getpch(JCB);
headFCFS=ph;
pt=ph;
ps=head->
next;
while(ps)/*复制head链表*/ { ps->
flat=1;
p=getpch(JCB);
copynode(p,ps);
pt->
next=p;
/*连接*/ pt=pt->
next;
ps=ps->
next;
} } void sortSJF()/*短作业优先*/ { JCB *pt=NULL,*ph=NULL,*p=NULL,*ps=NULL,*psminnt=NULL,*pflat=NULL;
int i=0;
pflat=head->
next;
while(pflat)/*清除是否被复制的标志位*/ { pflat->
flat=0;
pflat=pflat->
next;
} ph=getpch(JCB);
headSJF=ph;
p=getpch(JCB);
/*无论是哪一种算法,第一个提交的作业都是第一个运行这是书上的知识*/ copynode(p,head->
next);
ph->
next=p;
/*将第一个提交的作业第一个运行,可以充分利用处理机*/ pt=p;
for(i=0;
inext->
next;
psminnt=head->
next->
next;
/*作业所需时间最小的结点*/ while(psminnt->
flat==1)psminnt=psminnt->
next;
while(ps->
flat==1)ps=ps->
next;
while(ps)/*找出一个未复制过的且所需时间最小的结点进行复制*/ { if(ps->
flat==0&
&
ps->
ntimentime) { psminnt=ps;
} ps=ps->
next;
} psminnt->
flat=1;
/*置复制标志位为1下面进行复制*/ p=getpch(JCB);
copynode(p,psminnt);
pt->
next=p;
pt=pt->
next;
} } JCB *delenode(JCB *ph,JCB *p) { JCB *p1=NULL,*p2=NULL,*pt=NULL;
p1=ph;
p2=p1->
next;
while(p2&
&
p2!=p) { p2=p2->
next;
p1=p1->
next;
} if(p2!=p) { printf( \n删除结点失败\n );