📄 qiner.cpp
字号:
#include <iostream.h>
#include <stdlib.h>
#include<stdio.h>
#include <string.h>
#include <time.h>
//************************************************
class empty_block;
class node //物理块节点
{
public:
friend class empty_block;
private:
node(int d=0){physic_num=d;next=0;}
node *next; //下一个物理块
int physic_num; //物理块号
};
class empty_block //物理块链表
{
public:
empty_block(){linklist=0;}
empty_block(int d){linklist=new node(d);}
void Insert(int d=0); //插入空闲物理块
void Del_list(int d); //删除物理块
void print(); //串联结构存储时,输出每文件对应存储链中的值
private:
node *End(); //最后一个空闲块
node *linklist;
};
void empty_block::Insert(int d) //插入物理块号d的空闲物理块
{
node *pt=new node(d);
if(linklist==0)
linklist=pt;
else
(End())->next=pt;
}
node *empty_block::End() //返回空闲链表的最后一个物理块
{
node *prv,*pt;
for(prv=pt=linklist;pt;prv=pt,pt=pt->next)
;
return prv;
}
void empty_block::Del_list(int d) ////删除物理块号为d的物理块
{
if(linklist==0)
cout<<"empty!\n";
else
{
node *pt=linklist;
node *pr=linklist;
if(linklist->physic_num==d)
linklist=linklist->next;
else
{
while(pt->physic_num!=d && pt)
{
pr=pt;
pt=pt->next;
}
pr->next=pt->next;
pt->next=0;
}
}
}
void empty_block::print() //输出每文件对应存储链中的值
{
node *prv,*pt;
for(prv=pt=linklist->next;pt;prv=pt,pt=pt->next)
{
cout<<pt->physic_num<<" ";
pt=pt->next;
}
cout<<endl;
}
long Rand(int t) //产生随机数
{
srand( (unsigned)time( NULL ) );
int i=rand()%(t)+1 ;
return i;
}
//***********************************************************
class List;
class Item //索引表项
{
public:
friend class List;
private:
Item(int d=0,int e=0){physic_num=d;logic_num=e;next=0;}
Item *next;
int physic_num;//物理块号
int logic_num;//逻辑块号
};
class List //文件的索引表,对应FCB中的index
{
public:
List(){list=0;}
List(int e){list=new Item(e);} //e为逻辑块号
void print();
void insert(int d=0,int e=0);
private:
Item *end();
Item *list;
};
void List::print() //输出索引表中每个逻辑块对应的物理块号
{
Item *pt=list;
while(pt)
{
cout<<pt->physic_num<<" ";
pt=pt->next;
}
}
void List::insert(int d,int e) //插入逻辑块号为e和物理块号为d的索引项到索引表的最后
{
Item *pt=new Item(d,e);
if(list==0)
list=pt;
else
(end())->next=pt;
}
Item *List::end() //索引表的最后一个索引项
{
Item *prv,*pt;
for(prv=pt=list;pt;prv=pt,pt=pt->next)
;
return prv;
}
//************************************************
class FCB //文件控制块类
{
public:
friend void change(FCB &q);
FCB(){size=0;firstblock=0;flag=0;}
void print1(){Index.print();} //打印文件对应索引表中每个逻辑块对应的物理块号
int getsize(){size=Rand(15);return size;} //随机产生文件大小
void IN(int a,int b){Index.insert(a,b);} //将物理块插入到文件的索引表
public:
int firstblock; //连续存储时,此文件对应的第一个物理块号
int size; //文件大小
int flag; //标志文件是否被分配好空间
List Index;
};
//*******************************************
void FLX(FCB p, int x,int i,int init)
{ //连续存储的分配,x:随机产生的文件个数,i:物理块的个数,init:物理块的起始地址
srand( (unsigned)time( NULL ) );
for (int k=0;k<x;k++)
{
cout<<"file"<<k+1;
int l=rand()%15+1;
if (l<=i)
{
p.flag=1;
p.firstblock=init;
init=init+l;
i=i-l;
cout<<" "<<l<<" ";
for(int j2=p.firstblock;j2<init;j2++)
{
cout<<j2<<" ";
}
cout<<endl;
}
else
{
p.flag=0;
p.firstblock=-1;
cout<<" "<<l<<" "<<"存储空间不足!"<<endl;
}
}
}
int FCL(FCB p, int x,int value[][1],empty_block eq,empty_block fq,int k,int y)
{ //x:物理块数,value[][1]:标志物理块是否被分配,eq:空闲表,fq:文件所分配的物理块表k:文件长度,y:物理块数)
if(k<=y) //文件长度小于空闲块数
{
int m=0;
cout<<" "<<k<<" ";
for(int a=0;a<k;a++) //k,文件长度
{
while(m<=x)
{
m=Rand(x); //随机给文件分配物理块
if(value[m][1]==0 ) //若此物理块未被分配
{
eq.Del_list(m); //此物理块从空闲表中删除
value[m][1]=1; //置标志为1,表示此物理块被分配
fq.Insert(m); //将此物理块加入到文件分配空间的表中
//cout<<m<<" ";
break;
}
}
}
fq.print();
//cout<<endl;
return 1;
}
else
{
cout<<" "<<k<<" "<<"存储空间不足!"<<endl;
return 0;
}
}
int FSY(FCB p, int x,int value[][1],empty_block q,int k,int y)
{ //x:物理块数,value[][1]:标志物理块是否被分配,Empty_list:空闲表,k:文件长度,y:物理块数)
if(k<=y) //文件长度小于空闲块数
{
int m=0;
cout<<" "<<k<<" ";
for(int a=0;a<k;a++) //k,文件长度
{
while(m<=x)
{
m=Rand(x); //随机给文件分配物理块
if(value[m][1]==0 ) //若次物理块未被分配
{
q.Del_list(m); //此物理块从空闲表中删除
value[m][1]=1; //置标志为1,表示此物理块被分配
p.IN(m,a); //将此物理块插入到此文件的索引表
break;
}
}
}
p.print1();
cout<<endl;
return 1;
}
else
{
cout<<" "<<k<<" "<<"存储空间不足!"<<endl;
return 0;
}
}
//**********************************
void main()
{
cout<<"---------------模拟物理文件的存储过程------------------"<<endl<<endl;
cout<<" ----------------------------------"<<endl;
cout<<" Y——开始运行"<<endl;
cout<<" N——退出程序"<<endl;
cout<<" ---------------------------------"<<endl;
printf("请输入提示符:(Y/N)");
char c=getchar();
cout<<endl;
int i,temp,b,bi;
int avail[100][1]; //物理块数组
empty_block Empty_list;
empty_block Full_list;
FCB fcb;
if(c=='y')
{
temp=Rand(10); //文件个数
cout<<"文件数:"<<temp;
bi=b=i=Rand(100); //产生的物理块数
cout<<" 存储空间大小为:"<<i<<endl;
//--------模拟连续文件的存储过程-----------
cout<<endl<<"--------模拟连续文件的存储过程-----------"<<endl;
cout<<"文件名 文件大小(块) 占用存储空间"<<endl;
for(int a1=0;a1<i;a1++)
{
avail[a1][1]=0;
}
int init=0;
FLX(fcb, temp,i,init);
//--------模拟串联文件的存储过程-----------
cout<<endl<<"--------模拟串联文件的存储过程-----------"<<endl;
cout<<"文件名 文件大小(块) 占用存储空间"<<endl;
for(int a=0;a<i;a++)
{
avail[a][1]=0;
Empty_list.Insert(a+1);
}
for(int j=0;j<temp;j++)
{
cout<<"file"<<j+1;
int l=fcb.getsize();
if(FCL(fcb,i,avail,Empty_list,Full_list,l,b))
b=b-l;
//else
//break;
}
//--------模拟索引文件的存储过程-----------
cout<<endl<<"--------模拟索引文件的存储过程-----------"<<endl;
cout<<"文件名 文件大小(块) 占用存储空间"<<endl;
i=bi;b=bi;
for(int a2=0;a2<i;a2++)
{
avail[a2][1]=0;
Empty_list.Insert(a2+1);
}
for(int j1=0;j1<temp;j1++)
{
cout<<"file"<<j1+1;
int l=fcb.getsize();
if(FSY(fcb,i,avail,Empty_list,l,b))
b=b-l;
//else
// break;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -