📄 dpartition.cpp
字号:
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "DPartition.h"
#include "malloc.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TMainFrm *MainFrm;
//---------------------------------------------------------------------------
__fastcall TMainFrm::TMainFrm(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
typedef struct LNode
{
struct LNode *prior;//前趋结点
int size; //内存空间大小
int address; //首地址
struct LNode *next;//后继结点
String fileName; //分配给的文件名
}LNode,*FreeList;
FreeList head,cur;
int maxSize = 640,minSize = 10;
//---------------------------------------------------------------------------
void Display()
{
MainFrm->Memo1->Lines->Add("当前空闲分区链信息如下:");
MainFrm->Memo1->Lines->Add("分区大小(KB)\t分区始址\t状态\t作业名");
cur = head->next;
while(cur != NULL)
{
if(cur->fileName == "")
MainFrm->Memo1->Lines->Add(IntToStr(cur->size)+"\t\t0x"+IntToHex(cur->address * 1024,8)+"\t空闲\t"+cur->fileName);
else
MainFrm->Memo1->Lines->Add(IntToStr(cur->size)+"\t\t0x"+IntToHex(cur->address * 1024,8)+"\t已用\t"+cur->fileName);
cur = cur->next;
}
}
//---------------------------------------------------------------------------
void __fastcall TMainFrm::FormCreate(TObject *Sender)
{
head = (FreeList) malloc (sizeof(LNode));
head->next = head->prior = NULL; //建立一个带头结点的双向链表
FreeList temp = (FreeList) malloc (sizeof(LNode)); //生成一个新结点
temp->size = maxSize;
temp->address = 0;
temp->fileName = "";
temp->next = head->next;
temp->prior = head;
head->next = temp;
}
//---------------------------------------------------------------------------
//空闲分区的分配算法
bool __fastcall TMainFrm::Apply(String fileName,int size)
{
FreeList temp = (FreeList) malloc (sizeof(LNode));
FreeList min = (FreeList) malloc (sizeof(LNode));
//查找第一个符合要求的结点
for(cur = head->next;cur && cur->fileName != "" || cur->size < size;cur = cur->next);
min = cur;
if(BF->Checked)//如果选择的是最佳适应算法则要查找出所有符合要求结点中最小的一个
{
for(cur;cur;cur = cur->next)
if(cur->size < min->size && cur->fileName == "") min = cur;
}
if(min)
{
if(min->size - size <= minSize) temp = min;//不可再分则直接分配给作业
else
{//从可用分区中划出size大小的内存空间
temp->size =size;
temp->address = min->address;
min->size -= size;
min->address += size;
temp->prior = min->prior;
min->prior->next = temp;
min->prior = temp;
temp->next = min;
}
temp->fileName = fileName;
return true;
}
else return false;
}
//---------------------------------------------------------------------------
//空间释放算法
void __fastcall TMainFrm::SetFree(String fileName)
{
for(cur = head->next;cur && cur->fileName != fileName;cur = cur->next);//找到结点
if(cur)
{
if(cur->prior != head && cur->prior->fileName == "")
{//不为第一结点且与前一可用区相邻
if(cur->next != NULL && cur->next->fileName == "")
{//与后一可用分区相邻
cur->size += cur->next->size;
cur->next = cur->next->next;
if(cur->next->next != NULL) cur->next->next->prior = cur;
}
cur->prior->size += cur->size;
cur->prior->next = cur->next;
if(cur->next != NULL) cur->next->prior = cur->prior;
}
else if(cur->next != NULL && cur->next->fileName == "")
{//与后一可用分区相邻且不为空表目
cur->fileName = "";
cur->size += cur->next->size;
cur->next = cur->next->next;
if(cur->next->next != NULL) cur->next->next->prior = cur;
}
else
{
cur->fileName = "";
}
}
else MessageBox(NULL,"释放空间失败!","警告",false);
}
//---------------------------------------------------------------------------
void __fastcall TMainFrm::Btn_CreateClick(TObject *Sender)
{
String fileName;
int size;
if(Edit_CName->Text == "")
{
MessageBox(NULL,"请输入作业名!","错误",false);
return;
}
else if(Edit_Size->Text == "")
{
MessageBox(NULL,"请输入作业的大小!","错误",false);
return;
}
fileName = Edit_CName->Text;
size = StrToInt(Edit_Size->Text);
if(Apply(fileName,size)) Display();
else MessageBox(NULL,"没有足够的可用空间!","提示",false);
}
//---------------------------------------------------------------------------
void __fastcall TMainFrm::Btn_FreeClick(TObject *Sender)
{
String fileName;
fileName = Edit_FName->Text;
SetFree(fileName);
Display();
}
//---------------------------------------------------------------------------
void __fastcall TMainFrm::FormClose(TObject *Sender, TCloseAction &Action)
{
for(cur = head;cur;cur = cur->next) free(cur);
}
//---------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -