SCANスキャンアルゴリズム
6362 ワード
このアルゴリズムは,アクセスしたいトラックと現在のトラックとの距離だけでなく,トラックの現在の移動方向をより優先的に考慮する.
#include
#include
#include
#include
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(panduancolumn;
jiange=panduan;
}
}
p=p->next;
}
if(truecol==0){
direction=-1;
}
}
if(direction==-1){
while(t){
if(t->columncolumn;
if(panduancolumn;
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(" :
");
scanf("%d",&disk_length);
printf(" :
");
scanf("%d",&num);
printf(" :
");
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(" :
");
scanf("%d",&location);
printf(" (1 ,-1 ):
");
scanf("%d",&direction);
printf("
:
");
sum_move=0;
for(i=1;i<=num;i++)
{
SCAN(head);
}
ave_move=(float)sum_move/num;
printf("
:%d
",sum_move);
printf("
:%.2f
",ave_move);
}