实验:磁盘调度算法——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;
}