选择这样的进程,其要求访问的磁道与当前磁头所在的磁道距离最近,以使每次的寻道时间最短
#include <malloc.h>
#include<stdio.h>
#include<math.h>
#include <limits.h>
typedef struct track{
int column;
struct track *next;
}node;
int location; /*当前磁头位置*/
int sum_move; /*磁头移动总磁道数*/
float ave_move; /*磁头移动平均磁道数*/
int direction; /*磁头移动的方向:direction=1 表示从里向外移动,direction=-1 表示从 外向里移动*/
int found_node(node *head) /*找到离当前磁头最近且与direction 同方向的磁道*/
{
node *p,*t;
int panduan,truecol=0,jiange=10000;
p=head;
t=head;
while(p&&t){
if(direction==1){
while(p){
if(p->column>=location)
{
panduan=p->column-location;
if(panduan<jiange)
{
truecol=p->column;
jiange=panduan;
}
}
p=p->next;
}
if(truecol==0){
direction=-1;
}
}
if(direction==-1){
while(t){
if(t->column<location)
{
panduan=location-t->column;
if(panduan<jiange)
{
truecol=t->column;
jiange=panduan;
}
}
t=t->next;
}
if(truecol==0){
direction=1;
}
}
}
sum_move+=jiange;
location=truecol;
printf("%d ",truecol);
return truecol;
}
node *SCAN(node *head) /*调用found_node 找到满足条件的磁道,并从head 链表中删除该结点*/
{
node *pre,*p;
int a;
a=found_node(head);
pre=NULL;
p=head;
while(p&&(p->column!=a)){
pre=p;
p=p->next;
}
if(p){
if(!pre) {head=head->next;}
else pre->next=p->next;
}
return head;
}
void main()
{
int i,num,disk_length;
node *head,*p1,*p2;
head=NULL;
printf("输入磁盘柱面总数:\n");
scanf("%d",&disk_length);
printf("输入磁盘读写请求总数:\n");
scanf("%d",&num);
printf("输入磁盘读写请求柱面号序列:\n");
for(i=1;i<=num;i++)
{
p1=(node *)malloc(sizeof(node));
scanf("%d",&p1->column);
if(head==NULL){
head=p1;
p2=p1;
}
else{
p2->next=p1;
p2=p1;
}
p2->next=NULL;
}
printf("输入磁盘当前位置为:\n");
scanf("%d",&location);
printf("输入磁盘移动方向(1 表示从里向外移动,-1 表示从外向里移动):\n");
scanf("%d",&direction);
printf("\n依次访问的柱面号为:\n");
sum_move=0;
for(i=1;i<=num;i++)
{
SCAN(head);
}
ave_move=(float)sum_move/num;
printf("\n总的移动柱面次数为:%d\n",sum_move);
printf("\n平均移动次数为:%.2f\n",ave_move);
}