資源簡介
標準的成組鏈接法。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?“<se)<<“?Block(s)?as?follows:\n“;
cout<“--->“;
for(int?i=0;i<*(MemoryBlock.base);i++)
cout<<*(MemoryBlock.top++)<“???“;
cout< IsFirstGroup=false;
GroupID++;
}
else
{???
????????????DiskBlock[FirstBlockID].top=DiskBlock[FirstBlockID].base+1;
cout<“---|------------------------Group?“<se)<<“?Block(s)?as?follows:\n“;
cout<“--->“;
for(int?i=0;i<*(
- 上一篇:生成指定長度的Wav空白文件--
- 下一篇:c++ MODBUS串行通信程序
評論
共有 條評論