用单链表实现磁盘调度算法的时候,最短寻道时间算法不知道哪错了

问题描述

用单链表实现磁盘调度算法的时候,最短寻道时间算法不知道哪错了

#include
#include
#include
#define Max 5

typedef struct DiskLine
{//磁盘请求链表
int Location;//磁盘请求位置
DiskLine *next;//指向下一节点的指针
}DiskLine;

//初始化磁盘链表
void InitList(DiskLine *&L)
{
L=(DiskLine *)malloc(sizeof(DiskLine));
L->next=NULL;
}

void CreateLine(DiskLine *&L,int a[],int n)
{
DiskLine *s,*r;
int i;
//L=(DiskLine *)malloc(sizeof(DiskLine));
r=L;
for(i=0;i<=n;i++)
{
s=(DiskLine *)malloc(sizeof(DiskLine));

s->Location=a[i];
r->next=s;
r=s;
}
r->next=NULL;
}

void Delet(DiskLine *L)
{//销毁磁盘请求链表
DiskLine *p,*q;
for(p = L; p != NULL; )
{
q = p;
p = p->next;
free(q);
}
p = q =NULL;
}//Delet

void FCFS(DiskLine *L)
{
//先进先出算法
DiskLine *temp1,*temp2;
temp2 = L;
printf("%dn",temp2->Location);
int i=0,Sum = 0;
printf("先进先出算法调度的顺序:n");
for( temp1 = L->next; temp1->next!= NULL; temp1 = temp1->next, temp2 = temp2->next)
{
//顺序输出
printf("%d ",temp1->Location);
Sum += abs(temp1->Location - temp2->Location);
i++;
}
printf("n");
printf("磁盘的寻道长度为%dn",Sum);
printf("磁盘的平均寻道长度为%dn",Sum/i);
}//FCFS

int SSTF(DiskLine *L)
{//最短寻道时间优先算法
DiskLine *L2;
DiskLine *p,*q1,*q2;
DiskLine *temp1,*temp,*temp2;
int min,Sum = 0;
//按照距离上一次磁头位置最近的顺序重新排列调度请求链表
L2 = (DiskLine *)malloc(sizeof(DiskLine));//重排列后的链表头节点
L2->Location = L->Location;//初始位置
L2->next = NULL;
q2 = L2;
temp1 = L;
for(temp2= L; temp2->next != NULL; temp2=temp2->next)
{
min =abs(temp2->next->Location -temp1->Location);
for(p = L; p->next != NULL; p = p->next)
{//从原链表中选取距离磁头最近的请求位置,将其插入L2的链尾
if(abs(p->next->Location - temp1->Location) < min)
{
min = abs(p->next->Location - temp1->Location);
q1 = p->next;
}
}

    //将节点从原链表删除
    q2->next = q1->next;
    q1->next = q1->next->next;
    q2->next->next = NULL;
    Sum += min;
    /*if(L->next == NULL)
        break;//退出循环条件*/
}//

for(temp = L2->next;temp->next!= NULL; temp = temp->next)
{//输出重排列的链表
    printf("  %d  ",temp->Location);
}
L = L2;//便于销毁操作
return Sum;

}

int SCAN(DiskLine *L)
{//扫描算法
DiskLine *L2,*L3;
DiskLine *p2,*p3;
int Sum = 0,Sum1,Sum2;
DiskLine *temp = L->next;
L2 = (DiskLine *)malloc(sizeof(DiskLine));
L2->Location = 53;
L2->next = NULL;
p2 = (DiskLine *)malloc(sizeof(DiskLine));
//保证磁头可到达0位置
p2->Location = 0;
p2->next = L2->next;
L2->next = p2;
L3 = (DiskLine *)malloc(sizeof(DiskLine));
L3->Location = 0;
L3->next = NULL;
p2 = L2->next;
p3 = L3;
while(temp != NULL)
{
if((temp->Location - L->Location) <= 0)
{//选出原链表中请求位置小于等于磁头初始位置的节点插入L2链尾
p2->next = temp;
temp = temp->next;
p2 = p2->next;
p2->next = NULL;

}
else
{//选出原链表中请求位置大于磁头初始位置的节点插入L3链尾
p3->next = temp;
temp = temp->next;
p3 = p3->next;
p3->next = NULL;
}
}
Sum1=SSTF(L2);//对链表L2调用SSTF算法
Sum2=SSTF(L3);//对链表L3调用SSTF算法
Sum=Sum1 + Sum2;
return Sum;
}//SCAN

int C_SCAN(DiskLine *L)
{//循环扫描算法
DiskLine *L2,*L3;
DiskLine *p2,*p3;
int Sum = 0,Sum1,Sum2;
DiskLine *temp = L->next;
L2 = (DiskLine *)malloc(sizeof(DiskLine));
L2->Location = 0;
L2->next = NULL;
//保证磁头能到达0位置
p2 = (DiskLine *)malloc(sizeof(DiskLine));
p2->Location = 0;
p2->next = L2->next;
L2->next = p2;
L3 = (DiskLine *)malloc(sizeof(DiskLine));
L3->Location = 53;
L3->next = NULL;
//保证磁头能到达200位置
p3 = (DiskLine *)malloc(sizeof(DiskLine));
p3->Location = 200;
p3->next = L3->next;
L3->next = p3;
p2 = L2->next;
p3 = L3->next;
while(temp != NULL)
{//同SCAN
if((temp->Location - L->Location) <= 0)
{
p2->next = temp;
temp = temp->next;
p2 = p2->next;
p2->next = NULL;

}
else
{
p3->next = temp;
temp = temp->next;
p3 = p3->next;
p3->next = NULL;

}
}
Sum1 = SSTF(L3);
Sum2 = SSTF(L2);
Sum = Sum1 + Sum2;
return Sum;
}//C_SCAN

void main()
{
DiskLine *L,*r;
InitList(L);
int choice,Queue[Max];
printf("----------------------磁盘调度模拟----------------n");
printf("请输入磁盘请求的个数:");
printf("%dn",Max);
printf("-----------------------初始状态-------------------n");
printf("nn");
printf("磁头初始位置为:");
scanf("%d",&L->Location);
printf("磁盘调度请求队列:n");

for(int i=0;i<Max;i++)
    scanf("%d",&Queue[i]);
CreateLine(L,Queue,Max);

printf("请选择调度算法:n");
printf("    1 为FCFS<先来先服务调度法>;n");
printf("    2 为SSTF<最短寻道时间优先扫描算法>;n");
printf("    3 为SCAN<扫描算法>;n");
printf("    4 为C_SCAN<循环扫描算法>;n");
printf("    5 为退出;n");
printf("请输入你的选择:");
scanf("%d",&choice);
switch(choice)
{
case 1:FCFS(L);break;
case 2:SSTF(L);break;
case 3:SCAN(L);break;
case 4:C_SCAN(L);break;
case 5:break;
default:printf("ERROR!");
}

}

注:这是老师给的算法,但是基本上都有问题,目前SSTF被我改成这样,我真的不知道哪儿错了,求指点

时间: 2024-09-11 18:26:10

用单链表实现磁盘调度算法的时候,最短寻道时间算法不知道哪错了的相关文章

3.8.2单链表的删除

        现在我们再来看单链表的删除.设存储元素ai的结点为q,要实现将结点q删除单链表的操作,其实就是将它的前继结点的指针绕过,指向它的后继结点即可(如图3-8-5所示).         我们所要做的,只是实际上就是一步,p->next=p->next->next,用q来取代p->next,即是 q=p->next; p->next=q->next;         解读这两句代码,也就是说让p的后继的后继结点改成p的后继结点.有点拗口呀,那我再打个形象

小菜一步一步学数据结构之(四)单链表

上一篇博客学习了顺序表,最后也说明了顺序表属于静态存储,数据元素的个数不能自由的扩充.为了解决这个问题我们引入了链表 链表存储结构 结点在存储器中的位置是任意的,即逻辑上相邻的数据元素在物理上不一定相邻,因此线性表的链式表示又称为非顺序映像或链式映像. 各个结点有两个域组成: * 数据域:存储元素数值数据 * 指针域:存储直接后继结点的存储位置 名词解析 1. 结点:数据元素的存储映像.有数据域和指针域两部分组成. 2. 链表:n个结点由指针链组成一个链表.它是线性表的链式存储映像,称为线性表的

数据结构模版----单链表实现方式总结

数据结构模版----单链表实现方式总结 前面我们提供了四种方式实现的单链表,有带头结点的不带头结点的,而单链表的结构体定义也有两种方式,那么这些实现方式,到底有什么区别呢,为什么会出现这么多种实现方式呢,下面我们就来细细体会 一 单链表结构体的实现区别 首先我们对比一下,单链表结构体 不同方式的单链表实现时,链表结点的实现是相同的,不同之处在于单链表结构体的实现上 单链表结构体的实现 [cpp] view plain copy print? typedef int ElemType;      

单链表的实现

在单链表中,我们需要在内部有一个头节点,我们可以通过这个头节点找到其他的节点,相当于一个线索. 纵观顺序结构的线性表和单链表的实现,难点基本上都在于添加和删除操作.基于数组的线性表中,数组的索引就相当于是线性表的序号,但在单链表中,我们没有序号这个东西,所以在添加和删除操作中,我们需要先找到指定的元素,然后才能继续进行操作.在插入操作中,我们需要同时保存有当前节点的前一个节点和当前的节点,因为当前要插入的节点要放在前一个节点的Next引用域,而当前节点要放在要插入节点的next域.删除节点与此相

单链表的顺序-c++正序与逆序创建单链表有什么区别

问题描述 c++正序与逆序创建单链表有什么区别 c++正序与逆序创建单链表有什么本质的区别,逆序比顺序的优点体现在哪? 解决方案 逆序没什么特别的好处,给你学编程的时候练练手玩的,在实际的项目中会用到标准库,那是双向链表,没有逆序创建一说. 要说逆序的好处:当要加入新的数据时,不需要遍历链表,可以直接在头结点之后插入即可,减少时间复杂度 解决方案二: 没有太大价值吧......不过双向的链表应用很广泛 解决方案三: 逆序创建单链表

java单链表常用操作

总结提高,与君共勉 概述. 数据结构与算法亘古不变的主题,链表也是面试常考的问题,特别是手写代码常常出现,将从以下方面做个小结 [链表个数] [反转链表-循环] [反转链表-递归] [查找链表倒数第K个节点] [查找链表中间节点] [判断链表是否有环] [从尾到头打印单链表-递归] [从尾到头打印单链表-栈] [由小到大合并有序单链表-循环] [由小到大合并有序单链表-递归] 通常在Java中这样定义单链表结构 [java] view plain copy <span style="fon

用java学习数据结构--单链表

数据|数据结构 /* * Created on 2004-9-10 * * 单链表中的结点类型声明. */package org.arliang;/** * @author 李梁 * * 单链表中的结点. */public class node{ private int data; //存放数据 private node link; //链接的下一个接点. public static void main(String[]args) { } /** * @return Returns the da

数据结构(C#):单链表

与顺序表相比,链表有自己的特点:插入.删除操作无需移动元素:能够高效实现动态内存分配:但 不能按节点索引快速定位到节点:由于需要记录指针域,系统开销较大. 本篇介绍单链表的实现,使用上一篇定义的接口. 代码: /* * File : SingleLinkedList.cs * Author : Zhenxing Zhou * Date : 2008-12-06 * Blog : http://www.xianfen.net/ */ using System; using System.Colle

大话数据结构二:线性表的链式存储结构(单链表)

1. 线性表的链式存储结构:指的是用一组任意的存储单元存储线性表的数据元素,这组存储单元可以是连续的,也可以是不连续的,这就意味着这些数据元素可以存在内存未被占用的任意位置. 2. 结点:结点由存放数据元素的数据域和存放后继结点地址的指针域组成. 1.)顺序存储结构中,每个数据元素只需要存数据元素的信息就可以了. 2.)链式存储结构中,除了要存储数据元素信息外,还要存储它的后继元素的存储地址. 3.)链表中第一个结点叫头结点,它的存储位置叫做头指针,它的数据域可以不存储任何信息,链表的最后一个结