资源简介
标准的成组链接法。30个盘块,五个一组,
代码片段和文件信息
#include
#include //用来分配内存的头文件
//******************************************************************************
const int BlockSize=512;//盘块的大小
const int GroupSize=5; //盘块分组数量,初始化时用
//******************************************************************************
typedef struct
{
int *top; //指向盘块号栈的顶部,也就是栈的最上面(不是书上画的视觉的最上面)的元素的下一个地址
int *base; //指向栈底,也就是装有盘块号栈的盘块的首地址
}Block;
Block DiskBlock[30]; //定义全局的系统盘块数组,用来模拟30个盘块的磁盘
Block MemoryBlock; //定义内存盘块的堆栈,模拟运行在内存中的堆栈这里为了直观,所以将内存盘块栈和系统盘块分别定义,但是这样增加了代码的长度
int GroupNumber; //盘块分组的数量,和GroupSize不一样,它是随着分配和回收而可能发生动态变化的
bool CopyPattern; //这里的CopyPattern的设置是为了后面分配和回收的算法共享Copy()函数。
int SpareBlockNumber; //系统现有的空闲盘块数量(计数)
//******************************************************************************
bool InitBlock() //为盘块(包括内存盘块)分配空间,并进行部分初始化工作。
{
for(int i=0;i<30;i++)
{
DiskBlock[i].base=(int *)malloc(BlockSize*sizeof(int));
if(!DiskBlock[i].base)
{
cout<<“存储分配失败“< return false;
}
DiskBlock[i].top = DiskBlock[i].base+1;
*(DiskBlock[i].base)=0; //B.base指向的地址存放盘块数量,这里是初始化。
}
MemoryBlock.base=(int *)malloc(BlockSize*sizeof(int));
if(!MemoryBlock.base)
{
cout<<“存储分配失败“< return false;
}
MemoryBlock.top = MemoryBlock.base+1;
*(MemoryBlock.base)=0; //B.base指向的地址存放盘块数量,这里是初始化。
return true;
}
//******************************************************************************
static void InitialAllocation()//初始化系统磁盘的盘块的成组链接情况,这里为了简单直观起见,先按盘块号由小到大的顺序进行连接
{ //程序运行中可以动态从控制台进行修改(分配或者回收)。
GroupNumber=0;
SpareBlockNumber=0; //空闲盘块的数目初始置为0
for(int j=0;j<30/GroupSize;j++)
{
for(int i = 0;i {
if(j==0)
{
*(MemoryBlock.top++) = i;
(*MemoryBlock.base)++;
SpareBlockNumber++; //空闲盘块的数目加一
}
else
{
*((DiskBlock[(j-1)*GroupSize].top++)) = j*GroupSize+i;
(*DiskBlock[(j-1)*GroupSize].base)++;
SpareBlockNumber++; //空闲盘块的数目加一
}
}
GroupNumber++;
}
}
//******************************************************************************
bool Show()
{
int FirstBlockID;
int GroupID=0; //用来标识当前盘块组的序号
bool IsFirstGroup=true;
cout<< “***************************************************************\n“;
for(int i=0;i {
if(IsFirstGroup)
{
MemoryBlock.top=MemoryBlock.base+1;
FirstBlockID=*(MemoryBlock.top);
cout<< “---|------------------------Group “<< GroupID <<“ has “<< *(MemoryBlock.base)<<“ Block(s) as follows:\n“;
cout<< “--->“;
for(int i=0;i<*(MemoryBlock.base);i++)
cout<<*(MemoryBlock.top++)<< “ “;
cout<< endl;
IsFirstGroup=false;
GroupID++;
}
else
{
DiskBlock[FirstBlockID].top=DiskBlock[FirstBlockID].base+1;
cout<< “---|------------------------Group “<< GroupID<<“ has “<< *(DiskBlock[FirstBlockID].base)<<“ Block(s) as follows:\n“;
cout<< “--->“;
for(int i=0;i<*(
- 上一篇:生成指定长度的Wav空白文件--
- 下一篇:c++ MODBUS串行通信程序
评论
共有 条评论