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

📄 os.cpp

📁 编程序实现下述磁盘调度算法
💻 CPP
字号:
#include<stdio.h> /*库文件包含*/ 
#include<string.h> /*用于字符串操作*/ 
#include<stdlib.h> /*用于exit函数*/ 
#include <math.h>
#include <process.h>
#include <iostream.h>


typedef struct node{
	int data;//数据域
    struct node *next;//指针域
}Node; //变量名
                 //把磁盘定义为链表

void creat();//建立链表
void fcfs(Node *head,int c,int f);//声明先来先服务函数
void sstf(Node *head,int c,int f);//声明最短寻道时间优先函数
void scan(Node *head,int c,int f);//声明扫描函数
void cscan(Node *head,int c,int f);//循环扫描算法
void nstepscan(Node *head,int c,int f);//N步扫描算法
void print(Node *);     //输出链表函数
int f,c=0;
Node *head;


void	main()
 {  
    // system("color 1f");
   //system("title 多功能工具");
   // system("MODE con: COLS=74 lines=25");
///	Node *p,*q,*s,*head;
	

	int cord;
	do{ 
//	system("cls"); //清屏 
       printf("\n---------------------------------------------\n");
       printf("\n                   主菜单 \n\n"); 
	   printf(" 1  建立要访问的磁道号    2  输入从第几磁道开始\n\n");
	   printf(" 3  先来先服务算法        4  最短寻道时间算法\n\n");
	   printf(" 5  扫描算法              6  循环扫描算法 \n\n");
       printf(" 7  N步扫描算法           0  退出  \n\n");
	   printf("----------------------------------------------\n");
	   printf("请输入你的选择 1,2,3,4,5,6其中一个:\n");
	   //cord=getnumber(6);
         
           scanf("%d",&cord);
       
	   switch(cord)
	   {
	   case 1:{creat();
		   }break;
	   case 2:{
		      printf("\n开始的磁道号: ");
			  scanf("%d",&f);
		  } break;
			
	    case 3:{fcfs(head,c,f);
			}break;
		case 4:{sstf(head,c,f);
			   }break;
	    case 5:{scan(head,c,f);
		    }break;
		case 6:{cscan(head,c,f);
			   }break;
	    case 7:{nstepscan(head,c,f);
			   }break;
	
	    case 0:exit(0);
	    }
	}while(cord<=7&&cord>=0);
}


/************************************************************************** 
void print(Node *head)
输入参数: 
结构体链表
返回参数: 
功能: 
按顺序输出链表中的数值
***************************************************************************/
void print(Node *head)//输出链表
{
	Node *p;
	p=head->next;
	if(p==NULL)
	{
		printf("单链表为空:");
	}else 
	{
		while(p!=NULL)
		{
			printf("%4d",p->data);
			p=p->next;
		}
	}
}

/************************************************************************** 
  void creat()
输入参数: 
返回参数: 
功能: 
建立线性链表, 
***************************************************************************/
  void creat()
  {
	  int x;Node *ptr,*p;
      head=(Node *)malloc(sizeof(Node));
      head->next=NULL;p=head;
      printf("\n 输入 0 结束\n\n x=?  ");scanf("%d",&x);
      while(x!=0)
	  {
		  ptr=(Node *)malloc(sizeof(Node));
          ptr->data=x;ptr->next=NULL;
          p->next=ptr;
          p=ptr;
          printf(" x=?  ");scanf("%d",&x);
  		  c++;
	  }printf("链表中的顺序是:");
	  print(head);
  }


/************************************************************************** 
 void fcfs(Node *head,int c,int f)
输入参数: 
Node *head :要扫描的磁道的线性结构体。int c:磁道号总数  int f :开始扫描的磁道 
返回参数: 
功能: 
按照fcfs的原则,按链表中的顺序,读取其中的数值,并且输出结果。
链表中前面的数先读取. 
***************************************************************************/
 void fcfs(Node *head,int c,int f)//先来先服务算法确         
 {
	  
	  node *l;//中间变量
	  float num=0;//NUM是总的寻道长度
	  l=head->next;
	  for(int i=0;i<c;i++)
	  {
		  num+=abs(l->data-f);//求绝对值的函数 DATA 是位置 L是后一道,F是前一道的位置
		  f=l->data;//下一次循开始点环指向改变,具体说是前一移动了一位
		  l=l->next;//要找的点也改变为下一个
	  }
	  num=num/c;//总长度除以次数就是平均的长度
	  printf("\n先来先服务的寻道顺序是");
	  print(head);
	  printf("\n平均寻道长度%f",num);
 }



/************************************************************************** 
sstf(Node *head,int c,int f)
输入参数: 
Node *head :要扫描的磁道的线性结构体。int c:磁道号总数  int f :开始扫描的磁道 
返回参数: 
功能: 
按照sstf的原则,按链表中的顺序,读取其中的数值,并且输出结果。
 根f最近的磁道先读取
***************************************************************************/
void sstf(Node *head,int c,int f)//最短寻道时间优先算法                
{
	Node *p,*q,*r,*s,*l,*m;
	l=(Node *)malloc(sizeof(Node));
	l->next=NULL;//开辟一个L名字的空间
	m=l;//赋给M,M,L指向同一个空间两个变量,建立另外的链表,用来排序
	q=head;//Q指向头节点                                  一.二组指针初始化
	p=head->next;//P下一个
	s=head;//S和Q都指向头
	r=head->next;//R和Pz指向下一个
	//两组四个指针,
	float num=0;//总的寻道长度
	//以下两重循的是寻找离出发点最近的磁道,并且在外的计算长度之和
	for(int i=0;i<c;i++)//循环C次就完成了
	{
		int min=abs(f-r->data);//可能是比F大,也可能比F是小,所以要求绝对值
		for(int j=0;j<c-i-1;j++)//还要循环C-I-1次就找到地I个元素了。
		{
			p=p->next;//第一组指针前移                               第二组指针
			q=q->next;//第一组指针前移
			if(abs(f-p->data)<min)//找到后面两个元素中哪个比较接近F
			{
    
				min=abs(f-p->data);//找到后赋给MIN
				r=p;//找到后离F第二个元素向前移动                   第一组指针
				s=q;//找到后离F第一个元素向后移动
			}
		}
		num+=abs(f-r->data);//求寻道总长度
		f=r->data;//开始所在磁道位置前移
		s->next=r->next;//开始磁道前移                            第一组指针
		r->next=NULL;//新链表的尾元素,指针域是空的
		m->next=r;//把R指为新链表的尾元素
		m=r;//用M指向新元素的表尾
		q=head;//从新开始扫描,以找到下一个元素
		p=head->next;//从新开始
		s=head;//从新开始
		r=head->next;//从新开始
	}
	//循环结束,两个表头,两条链表
	num=num/c;//平均寻找长度
	print(l);//输出新的链表
	printf("\n最短寻道时间优先顺序是");
	print(l);//输出新的链表
	printf("\n平均寻道长度%f",num);
}


/************************************************************************** 
scan(Node *head,int c,int f) 
输入参数: 
Node *head :要扫描的磁道的线性结构体。int c:磁道号总数  int f :开始扫描的磁道 
返回参数: 
功能: 
按照scan的原则,按链表中的顺序,读取其中的数值,并且输出结果。
每次循环完一次,重新读取链表 ,直到所有数据都读完.
***************************************************************************/
void scan(Node *head,int c,int f)//扫描算法           
{
	
	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;
	printf("\n扫描算法的顺序是");
	print(x);//输出新的链表
	printf("\n平均寻道长度%f",num);

}


/************************************************************************** 
cscan(Node *head,int c,int f) 
输入参数: 
Node *head :要扫描的磁道的线性结构体。int c:磁道号总数  int f :开始扫描的磁道 
返回参数: 
功能: 
按照cscan的原则,按照线性表中的顺序,读取其中的数值,并且输出结果。 
***************************************************************************/ 
void cscan(Node *head,int c,int f)//循环扫描算法    
{         



	printf("cscan:");


}


/************************************************************************** 
void nstepscan(Node *head,int c,int f) 
输入参数: 
Node *head :要扫描的磁道的线性结构体。int c:磁道号总数  int f :开始扫描的磁道 
返回参数: 
功能: 
按照nstepscan的原则,按照线性表中的顺序,读取其中的数值,并且输出结果。 
***************************************************************************/ 
void nstepscan(Node *head,int c,int f)//N步扫描算法             
{
	printf("nstepscan:");

}


⌨️ 快捷键说明

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