SCAN扫描算法

该算法不仅考虑到欲访问的磁道与当前磁道的距离,更优先考虑的是磁道的当前移动方向

#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);
}
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值