SCANスキャンアルゴリズム


このアルゴリズムは,アクセスしたいトラックと現在のトラックとの距離だけでなく,トラックの現在の移動方向をより優先的に考慮する.
#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); }