⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cpdd.cpp

📁 这是一个磁盘调度算法的源程序代码
💻 CPP
字号:
#include<iostream>
#include<cmath>
using namespace std;
typedef struct node{
int data;
struct node *next;
}Node;
void main()
{
void fcfs(Node *,int,int);//声明先来先服务函数
void sstf(Node *,int,int);//声明最短寻道时间优先函数
void scan(Node *,int,int);//声明扫描函数
void print(Node *);    //输出链表函数

Node *head,*p,*q;//建立一个链表
int it,c=0,f,s;//c为链表长度,f是开始的磁道号,s是选择那个算法
head=(Node *)malloc(sizeof(Node));
head->next=NULL;
q=head;
cout<<"This Process has been modified by Shelley!~~\n";
cout<<"请输入磁盘访问序列(磁道),以0为结束符:\n";
cin>>it;
while(it!=0)
{
p=(Node *)malloc(sizeof(Node));
p->next=NULL;
p->data=it;
q->next=p;
q=p;
cin>>it;
c++;
}
cout<<"请输入开始的磁道数(读写头起始位置):";
cin>>f;
print(head);
cout<<"磁道访问序列的长度为:"<<c<<endl;
cout<<"1、先来先服务算法"<<endl;
cout<<"2、最短寻道时间算法"<<endl;
cout<<"3、扫描算法"<<endl;
cout<<"0、退出"<<endl;
cout<<"请选择磁盘调度算法:";
cin>>s;
while(s!=0)
{
    switch(s)
    {
    case 1:cout<<"你选择了先来先服务算法"<<endl;
    fcfs( head,c,f);
break;
    case 2:cout<<"你选择了最短寻道时间优先"<<endl;
sstf( head,c,f);
break;
    case 3:cout<<"你选择了扫描算法"<<endl;
scan( head,c,f);
break;
    }
    cout<<"退出请选0,还要继续么?:";
    cin>>s;
}
}
void fcfs(Node *head,int c,int f)//先来先服务算法
{
void print(Node *);
Node *l;//,*m,*n;
float num=0;
l=head->next;
for(int i=0;i<c;i++)
{
num+=abs(l->data-f);
f=l->data;
l=l->next;
}
num=num/c;
cout<<"先来先服务算法的寻道顺序是:"<<endl;
print(head);
cout<<"平均寻道长度:"<<num<<endl;
}
void sstf(Node *head,int c,int f)//最短寻道时间优先算法
{
void print(Node *);
Node *p,*q,*r,*s,*l,*m;
l=(Node *)malloc(sizeof(Node));
l->next=NULL;
m=l;
q=head;
p=head->next;
s=head;
r=head->next;
float num=0;
for(int i=0;i<c;i++)
{
int min=abs(f-r->data);
for(int j=0;j<c-i-1;j++)
{
p=p->next;
q=q->next;
if(abs(f-p->data)<min)
{
    min=abs(f-p->data);
    r=p;
    s=q;
}
}
num+=abs(f-r->data);
f=r->data;
s->next=r->next;
r->next=NULL;
m->next=r;
m=r;
    q=head;
    p=head->next;
    s=head;
    r=head->next;
}
num=num/c;
cout<<"最短寻道时间优先顺序是:"<<endl;
print(l);
cout<<"平均寻道长度:"<<num<<endl;
}
void scan(Node *head,int c,int f)//扫描算法
{
void print(Node *);

int min,max,i=0,j=0;
float num=0;
Node *p,*q,*r,*s,*m,*n,*x,*y; 
r=(Node *)malloc(sizeof(Node));//存放比开始磁道小的磁道
r->next=NULL;
s=r;
m=(Node *)malloc(sizeof(Node));//存放比开始磁道大的磁道
m->next=NULL;
n=m;
x=(Node *)malloc(sizeof(Node));
x->next=NULL;
y=x;
q=head;
p=head->next;
while(p->next!=NULL)
{
if(p->data-f>0)
{
q->next=p->next;
p->next=NULL;
n->next=p;
n=p;
p=q->next;
i++;
}
else
{
q->next=p->next;
p->next=NULL;
s->next=p;
s=p;
p=q->next;
j++;
}

}
if(p->data>=f)
{
n->next=p;
n=p;
i++;
}
else
{
s->next=p;
s=p;
j++;
}
//print(r);
//print(m);
q=r;//对比开始磁道小的磁道排序
p=r->next;
while(q->next->next!=NULL)
{
q=q->next;
p=q->next;
max=q->data;
while(p->next!=NULL)
{
if(p->data>max)
{
    max=p->data;
    p->data=q->data;
    q->data=max;
    max=q->data;
}
p=p->next;
}
if(p->data>max)
{
max=p->data;
p->data=q->data;
q->data=max;
max=q->data;
}
}
//print(r);
q=m;
p=m->next;
while(q->next->next!=NULL)
{
q=q->next;
p=q->next;
min=q->data;
while(p->next!=NULL)
{
if(p->data<min)
{
    min=p->data;
    p->data=q->data;
    q->data=min;
    min=q->data;
}
p=p->next;
}
if(p->data<min)
{
min=p->data;
p->data=q->data;
q->data=min;
min=q->data;
}
}
//print(m);
x=m;
p->next=r->next;
y=x->next;
while(y->next!=NULL)
{
num+=abs(f-y->data);
f=y->data;
y=y->next;
}
num+=abs(f-y->data);
num=num/c;
cout<<"扫描算法的顺序是:"<<endl;
print(x);
cout<<"平均寻道长度为:"<<num<<endl;

}
void print(Node *head)//输出磁盘访问序列
{
Node *p;
p=head->next;
cout<<"磁盘访问序列为:";
if(p==NULL)
{
cout<<"访问序列为空!:";
}
else if(p->next==NULL)
{
cout<<p->data;
}
else
{
while(p->next!=NULL)
{
cout<<p->data<<"->";
p=p->next;
}
cout<<p->data<<endl;
}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -