?? dpartition.cpp
字號(hào):
//---------------------------------------------------------------------------
#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;//前趨結(jié)點(diǎn)
int size; //內(nèi)存空間大小
int address; //首地址
struct LNode *next;//后繼結(jié)點(diǎn)
String fileName; //分配給的文件名
}LNode,*FreeList;
FreeList head,cur;
int maxSize = 640,minSize = 10;
//---------------------------------------------------------------------------
void Display()
{
MainFrm->Memo1->Lines->Add("當(dāng)前空閑分區(qū)鏈信息如下:");
MainFrm->Memo1->Lines->Add("分區(qū)大小(KB)\t分區(qū)始址\t狀態(tài)\t作業(yè)名");
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; //建立一個(gè)帶頭結(jié)點(diǎn)的雙向鏈表
FreeList temp = (FreeList) malloc (sizeof(LNode)); //生成一個(gè)新結(jié)點(diǎn)
temp->size = maxSize;
temp->address = 0;
temp->fileName = "";
temp->next = head->next;
temp->prior = head;
head->next = temp;
}
//---------------------------------------------------------------------------
//空閑分區(qū)的分配算法
bool __fastcall TMainFrm::Apply(String fileName,int size)
{
FreeList temp = (FreeList) malloc (sizeof(LNode));
FreeList min = (FreeList) malloc (sizeof(LNode));
//查找第一個(gè)符合要求的結(jié)點(diǎn)
for(cur = head->next;cur && cur->fileName != "" || cur->size < size;cur = cur->next);
min = cur;
if(BF->Checked)//如果選擇的是最佳適應(yīng)算法則要查找出所有符合要求結(jié)點(diǎn)中最小的一個(gè)
{
for(cur;cur;cur = cur->next)
if(cur->size < min->size && cur->fileName == "") min = cur;
}
if(min)
{
if(min->size - size <= minSize) temp = min;//不可再分則直接分配給作業(yè)
else
{//從可用分區(qū)中劃出size大小的內(nèi)存空間
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);//找到結(jié)點(diǎn)
if(cur)
{
if(cur->prior != head && cur->prior->fileName == "")
{//不為第一結(jié)點(diǎn)且與前一可用區(qū)相鄰
if(cur->next != NULL && cur->next->fileName == "")
{//與后一可用分區(qū)相鄰
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 == "")
{//與后一可用分區(qū)相鄰且不為空表目
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,"請(qǐng)輸入作業(yè)名!","錯(cuò)誤",false);
return;
}
else if(Edit_Size->Text == "")
{
MessageBox(NULL,"請(qǐng)輸入作業(yè)的大小!","錯(cuò)誤",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);
}
//---------------------------------------------------------------------------
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -