磁盘调度算法

实验:磁盘调度算法——SCAN和SSTF

实验:磁盘调度算法——SCAN和SSTF

实验分析:

1.首先设置成双链表的形式,每个节点都有

磁道号和移动距离,以及左右指针,

2.创建磁道号链表

3.对链表进行排序

4.SSTF算法

5.SCAN算法

实验代码:

#include<stdlib.h>

#include<stdio.h>

#include<malloc.h>

#include<iostream>

using namespace std;

typedef int datatype;

typedef struct node{

    int number;//磁道号

    int num;//移动的距离

    struct node *rlink;

    struct node *llink;

}dnode;

dnode *create()//创建磁道号链表

{

    dnode*head,*p,*r;

    int x;

    head=r=NULL;

    printf("输入磁道号,-1表示结束:");

    scanf("%d",&x);

    while(x!=-1)

    {

       p=(dnode*)malloc(sizeof(dnode));

        p->number=x;

        p->num=0;

        if(head==NULL)

        {

            head=p;

            head->rlink=NULL;

            head->llink=NULL;

            r=p;

        }

        else{

            p->rlink=r->rlink;

             r->rlink=p;

             p->llink=r;

             r=p;

            }

           scanf("%d",&x);

    }

    if(r)  r->rlink=NULL;

    return head;

}

void print(dnode*head)

{

   dnode *p;

   p=head;

   while(p)

   {

       printf("磁道号%d     移动距离%d",p->number,p->num);

       printf("\n");

       p=p->rlink;

   }

}

dnode*sortSSTF(dnode*head)//对链表进行排序

{

    dnode *p,*q;

    int temp;

    p=head;

    q=head->rlink;

    while(p->rlink)

    {

        while(q)

        {

           if(p->number>q->number)

            {

               temp=p->number;

               p->number=q->number;

               q->number=temp;

            }

            q=q->rlink;

        }

        p=p->rlink;

        q=p->rlink;

    }

    return head;

}

void SSTF(dnode*head)

{

    int i,j;

   dnode*p,*q,*r,*s,*t,*w,*h,*d,*k,*L;

    dnode *khead;//设置一个新的带头结点的单链表,用于存储访问顺序

    printf("请输入起始磁道号:");

    scanf("%d",&i);

    s=sortSSTF(head);

    p=s;

    q=p;

    khead->rlink=NULL;

    khead->llink=NULL;

    d=k=khead;

 while(p&&p->number<i)//找到i的位置

        {

            r=p;

            p=p->rlink;

        }

        if(!p)//没找到,全小于i的值

        {

           r->num=i-r->number;

           L=(dnode*)malloc(sizeof(dnode));

            L->num=r->num;

           L->number=r->number;

            if(!k)//尾插入到新的链表

            {

                k->rlink=L;

                k=L;

            }

            else

            {

               L->rlink=k->rlink;

                k->rlink=L;

                L->llink=k;

                k=L;

            }

            r=r->llink;

           while(r)//往前循环

           {

               r->num=r->rlink->number-r->number;

               L=(dnode*)malloc(sizeof(dnode));

               L->num=r->num;

                L->number=r->number;

               if(!k)//尾插入到新的链表

             {

                k->rlink=L;

                k=L;

             }

             else

              {

               L->rlink=k->rlink;

                k->rlink=L;

                L->llink=k;

                k=L;

              }

                r=r->llink;

           }

        }

        else

        {

           if(p->llink==NULL)//是头节点

            {

               p->num=p->number-i;

               L=(dnode*)malloc(sizeof(dnode));

                L->num=p->num;

              L->number=p->number;

             if(!k)//尾插入到新的链表

             {

                k->rlink=L;

                k=L;

             }

             else

             {

               L->rlink=k->rlink;

                k->rlink=L;

                L->llink=k;

                k=L;

             }

                p=p->rlink;

                while(p)//往后循环

                {

                   p->num=p->number-p->llink->number;

                   L=(dnode*)malloc(sizeof(dnode));

                  L->num=p->num;

                 L->number=p->number;

               if(!k)//尾插入到新的链表

               {

                k->rlink=L;

                k=L;

               }

               else

               {

               L->rlink=k->rlink;

                k->rlink=L;

                L->llink=k;

                k=L;

               }

                   p=p->rlink;

                }

            }

            else//在中间

               {

                  t=p->llink;//指向左边

                   w=p;//指向右边

       if(i-t->number<w->number-i)//比较左右谁的值小,左边的距离更小

                  {

                     t->num=i-t->number;

                     L=(dnode*)malloc(sizeof(dnode));

                      L->num=t->num;

                    L->number=t->number;

                    if(!k)//尾插入到新的链表

                        {

                         k->rlink=L;

                          k=L;

                              }

                    else

                          {

                             L->rlink=k->rlink;

                         k->rlink=L;

                         L->llink=k;

                         k=L;

                           }

                      h=t;

                     t=t->llink;

                     while(t&&w)//左右两边的指针不为空

                      {

                       if(h->number-t->number<p->number-h->number)//左边值更小

                        {

                           t->num=h->number-t->number;

                           L=(dnode*)malloc(sizeof(dnode));

                            L->num=t->num;

                          L->number=t->number;

                         if(!k)//尾插入到新的链表

                          {

                          k->rlink=L;

                           k=L;

                              }

                        else

                          {

                            L->rlink=k->rlink;

                            k->rlink=L;

                            L->llink=k;

                             k=L;

                            }

                            h=t;

                           t=t->llink;

                        }

                        else//右边的值更小

                        {

                          p->num=p->number-h->number;

                          L=(dnode*)malloc(sizeof(dnode));

                          L->num=p->num;

                         L->number=p->number;

                       if(!k)//尾插入到新的链表

                         {

                         k->rlink=L;

                          k=L;

                              }

                       else

                          {

                            L->rlink=k->rlink;

                           k->rlink=L;

                           L->llink=k;

                            k=L;

                            }

                           h=p;

                          p=p->rlink;

                        }

                      }

                      if(!t)//左边为空

                      {

                         while(p)

                            {

                             p->num=p->number-h->number;

                            L=(dnode*)malloc(sizeof(dnode));

                            L->num=p->num;

                            L->number=p->number;

                         if(!k)//尾插入到新的链表

                           {

                           k->rlink=L;

                             k=L;

                              }

                          else

                           {

                            L->rlink=k->rlink;

                             k->rlink=L;

                            L->llink=k;

                             k=L;

                            }

                             h=p;

                            p=p->rlink;

                            }

                      }

 

                    if(!p)//右边为空

                         {

                            while(t)

                             {

                               t->num=h->number-t->number;

                               L=(dnode*)malloc(sizeof(dnode));

                          L->num=t->num;

                         L->number=t->number;

                       if(!k)//尾插入到新的链表

                         {

                         k->rlink=L;

                          k=L;

                              }

                       else

                          {

                            L->rlink=k->rlink;

                           k->rlink=L;

                           L->llink=k;

                            k=L;

                            }

                                h=t;

                               t=t->llink;

                             }

                         }

                  }

        else//刚开始右边的值更小

            {

               w->num=w->number-i;

                L=(dnode*)malloc(sizeof(dnode));

                          L->num=w->num;

                         L->number=w->number;

                       if(!k)//尾插入到新的链表

                         {

                         k->rlink=L;

                          k=L;

                              }

                       else

                          {

                            L->rlink=k->rlink;

                           k->rlink=L;

                           L->llink=k;

                            k=L;

                            }

                  h=w;

                   w=w->rlink;

                     while(t&&w)//左边两边不为空

                      {

                       if(h->number-t->number<w->number-h->number)//左边值小

                        {

                            t->num=h->number-t->number;

                           L=(dnode*)malloc(sizeof(dnode));

                          L->num=t->num;

                         L->number=t->number;

                       if(!k)//尾插入到新的链表

                         {

                          k->rlink=L;

                          k=L;

                              }

                       else

                          {

                            L->rlink=k->rlink;

                           k->rlink=L;

                            L->llink=k;

                            k=L;

                            }

                            h=t;

                           t=t->llink;

                        }

                        else//右边值小

                        {

                           w->num=w->number-h->number;

                          L=(dnode*)malloc(sizeof(dnode));

                          L->num=w->num;

                         L->number=w->number;

                       if(!k)//尾插入到新的链表

                         {

                         k->rlink=L;

                          k=L;

                              }

                       else

                          {

                            L->rlink=k->rlink;

                           k->rlink=L;

                            L->llink=k;

                            k=L;

                            }

                           h=w;

                          w=w->rlink;

                        }

                      }

                      if(!t)//左为空

                      {

                         while(w)

                            {

                            w->num=w->number-h->number;

                            L=(dnode*)malloc(sizeof(dnode));

                          L->num=w->num;

                          L->number=w->number;

                       if(!k)//尾插入到新的链表

                         {

                         k->rlink=L;

                          k=L;

                              }

                       else

                          {

                            L->rlink=k->rlink;

                           k->rlink=L;

                           L->llink=k;

                            k=L;

                            }

                             h=w;

                             w=w->rlink;

                            }

                      }

 

                    if(!w)//右位空

                         {

                            while(t)

                             {

                               t->num=h->number-t->number;

                               L=(dnode*)malloc(sizeof(dnode));

                          L->num=t->num;

                         L->number=t->number;

                       if(!k)//尾插入到新的链表

                         {

                         k->rlink=L;

                          k=L;

                              }

                       else

                          {

                            L->rlink=k->rlink;

                           k->rlink=L;

                           L->llink=k;

                            k=L;

                            }

                               h=t;

                               t=t->llink;

                             }

                         }

                  }

               }

        }

        d=khead->rlink;

        while(d)//打印新的链表

        {

            printf("磁道号%d     移动距离%d",d->number,d->num);

           printf("\n");

            d=d->rlink;

        }

}

void SCAN(dnode*head)

{

    int i,j;

   dnode*p,*q,*r,*s,*t,*w,*h,*x,*y,*z,*A,*B,*C,*d,*k,*L;

    dnode *khead;

    printf("请输入起始磁道号:");

    scanf("%d",&i);

    printf("请输入方向值,1表示正向,-1表示反向:");

    scanf("%d",&j);

    khead->rlink=NULL;

    khead->llink=NULL;

    d=k=khead;

if(j==1)//正向

{

     s=sortSSTF(head);

     p=s;

     q=s;

        while(p&&p->number<i)//找到i 的位置

        {

            r=p;

            p=p->rlink;

        }

        if(!p)//没找到

        {

           r->num=i-r->number;

           L=(dnode*)malloc(sizeof(dnode));

                          L->num=r->num;

                          L->number=r->number;

                     if(!k)//尾插入到新的链表

                         {

                         k->rlink=L;

                          k=L;

                              }

                       else

                          {

                            L->rlink=k->rlink;

                           k->rlink=L;

                           L->llink=k;

                            k=L;

                            }

            r=r->llink;

           while(r)//往前循环

           {

                r->num=r->rlink->number-r->number;

               L=(dnode*)malloc(sizeof(dnode));

                          L->num=r->num;

                         L->number=r->number;

                     if(!k)//尾插入到新的链表

                         {

                          k->rlink=L;

                          k=L;

                              }

                       else

                          {

                            L->rlink=k->rlink;

                           k->rlink=L;

                            L->llink=k;

                            k=L;

                            }

                r=r->llink;

           }

        }

        else//找到了

        {

           if(p->llink==NULL)//头节点

            {

               p->num=p->number-i;

                L=(dnode*)malloc(sizeof(dnode));

                          L->num=p->num;

                         L->number=p->number;

                    if(!k)//尾插入到新的链表

                         {

                         k->rlink=L;

                          k=L;

                              }

                       else

                          {

                            L->rlink=k->rlink;

                           k->rlink=L;

                           L->llink=k;

                            k=L;

                            }

                p=p->rlink;

                while(p)//往后循环

                {

                   p->num=p->number-p->llink->number;

                   L=(dnode*)malloc(sizeof(dnode));

                          L->num=p->num;

                         L->number=p->number;

                     if(!k)//尾插入到新的链表

                         {

                         k->rlink=L;

                          k=L;

                              }

                       else

                          {

                            L->rlink=k->rlink;

                           k->rlink=L;

                           L->llink=k;

                            k=L;

                            }

                   p=p->rlink;

                }

            }

            else//在中间

            {

                t=p->llink;

                w=p;

               p->num=p->number-i;

               L=(dnode*)malloc(sizeof(dnode));

                          L->num=p->num;

                         L->number=p->number;

                     if(!k)//尾插入到新的链表

                         {

                         k->rlink=L;

                          k=L;

                              }

                       else

                          {

                             L->rlink=k->rlink;

                           k->rlink=L;

                           L->llink=k;

                            k=L;

                            }

                h=p;

                p=p->rlink;

                while(p)//做正向的

                {

                  p->num=p->number-p->llink->number;

                  L=(dnode*)malloc(sizeof(dnode));

                          L->num=p->num;

                         L->number=p->number;

                      if(!k)//尾插入到新的链表

                         {

                         k->rlink=L;

                          k=L;

                              }

                       else

                          {

                            L->rlink=k->rlink;

                           k->rlink=L;

                           L->llink=k;

                            k=L;

                            }

                   h=p;

                   p=p->rlink;

                }

               t->num=h->number-t->number;

                L=(dnode*)malloc(sizeof(dnode));

                          L->num=t->num;

                         L->number=t->number;

                     if(!k)//尾插入到新的链表

                         {

                         k->rlink=L;

                          k=L;

                              }

                       else

                          {

                            L->rlink=k->rlink;

                           k->rlink=L;

                           L->llink=k;

                            k=L;

                            }

                h=t;

                t=t->llink;

                while(t)//做反方向的

                {

                 t->num=t->rlink->number-t->number;

                 L=(dnode*)malloc(sizeof(dnode));

                          L->num=t->num;

                         L->number=t->number;

                      if(!k)//尾插入到新的链表

                         {

                         k->rlink=L;

                          k=L;

                              }

                       else

                          {

                            L->rlink=k->rlink;

                           k->rlink=L;

                           L->llink=k;

                            k=L;

                            }

                  h=t;

                  t=t->llink;

                }

            }

        }

    }

else//方向的

    {

        z=sortSSTF(head);

        x=z;

        y=x;

        while(x->rlink)

            x=x->rlink;

       while(y&&y->number<i)//找到i的位置

        {

            r=y;

            y=y->rlink;

        }

        if(!y)//没找到

        {

           x->num=i-x->number;

           L=(dnode*)malloc(sizeof(dnode));

                          L->num=x->num;

                         L->number=x->number;

                     if(!k)//尾插入到新的链表

                         {

                         k->rlink=L;

                          k=L;

                              }

                       else

                          {

                            L->rlink=k->rlink;

                           k->rlink=L;

                           L->llink=k;

                            k=L;

                            }

            x=x->llink;

            while(x)//往前循环

            {

               x->num=x->rlink->number-x->number;

               L=(dnode*)malloc(sizeof(dnode));

                          L->num=x->num;

                          L->number=x->number;

                    if(!k)//尾插入到新的链表

                         {

                         k->rlink=L;

                          k=L;

                              }

                       else

                          {

                            L->rlink=k->rlink;

                           k->rlink=L;

                           L->llink=k;

                            k=L;

                            }

                x=x->llink;

            }

        }

        else//找到了

        {

           if(y->llink==NULL)//头节点

            {

               y->num=y->number-i;

               L=(dnode*)malloc(sizeof(dnode));

                          L->num=y->num;

                         L->number=y->number;

                    if(!k)//尾插入到新的链表

                         {

                         k->rlink=L;

                          k=L;

                              }

                       else

                          {

                            L->rlink=k->rlink;

                           k->rlink=L;

                           L->llink=k;

                            k=L;

                            }

                y=y->rlink;

                while(y)//往后循环

                {

                   y->num=y->number-y->llink->number;

                   L=(dnode*)malloc(sizeof(dnode));

                          L->num=y->num;

                         L->number=y->number;

            if(!k)

                         {

                         k->rlink=L;

                          k=L;

                              }

                       else

                          {

                            L->rlink=k->rlink;

                           k->rlink=L;

                           L->llink=k;

                            k=L;

                            }

                   y=y->rlink;

                }

            }

            else//中间

            {

                A=y->llink;

                B=y;

               A->num=i-A->number;

               L=(dnode*)malloc(sizeof(dnode));

                          L->num=A->num;

                         L->number=A->number;

                    if(!k)//尾插入到新的链表

                         {

                          k->rlink=L;

                          k=L;

                              }

                       else

                          {

                            L->rlink=k->rlink;

                           k->rlink=L;

                            L->llink=k;

                            k=L;

                            }

                h=A;

                A=A->llink;

                while(A)//做反向的

                {

                  A->num=A->rlink->number-A->number;

                   L=(dnode*)malloc(sizeof(dnode));

                          L->num=A->num;

                         L->number=A->number;

                 if(!k)//尾插入到新的链表

                         {

                         k->rlink=L;

                          k=L;

                              }

                       else

                          {

                            L->rlink=k->rlink;

                           k->rlink=L;

                           L->llink=k;

                            k=L;

                            }

                   h=A;

                   A=A->llink;

                }

               B->num=B->number-h->number;

               L=(dnode*)malloc(sizeof(dnode));

                          L->num=B->num;

                         L->number=B->number;

                   if(!k)//尾插入到新的链表

                         {

                         k->rlink=L;

                          k=L;

                              }

                       else

                          {

                             L->rlink=k->rlink;

                           k->rlink=L;

                           L->llink=k;

                            k=L;

                            }

                h=B;

                B=B->rlink;

                while(B)//做正向的

                {

                   B->num=B->number-B->llink->number;

                   L=(dnode*)malloc(sizeof(dnode));

                          L->num=B->num;

                         L->number=B->number;

                    if(!k)//尾插入到新的链表

                         {

                         k->rlink=L;

                          k=L;

                              }

                       else

                          {

                            L->rlink=k->rlink;

                           k->rlink=L;

                            L->llink=k;

                            k=L;

                            }

                    h=B;

                   B=B->rlink;

                }

            }

        }

 

    }

        d=khead->rlink;

        while(d)//打印

        {

            printf("磁道号%d     移动距离%d",d->number,d->num);

           printf("\n");

            d=d->rlink;

        }

}

int main()

{

    dnode *head,*p;

    int i;

    printf("请输入值,1表示SCAN,2表示SSTF:");

    scanf("%d",&i);

    printf("\n");

    if(i==1)

       {

           head=create();

          print(head);

         SCAN(head);

       }

    else

        {

            head=create();

            print(head);

            SSTF(head);

        }

return 0;

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值