#include <iostream>
#include <iomanip>
using namespace std;
// 分区描述器
struct node {
int adr; // 分区首地址
int size; // 分区大小
node* next; // 指向下一个分区的指针
};
// 全局变量
node* head1 = nullptr; // 空闲区队列首指针
node* back1 = nullptr; // 指向释放区node结构的指针
node* assign = nullptr; // 指向申请的内存分区node结构的指针
// 初始化空闲区队列
void init() {
head1 = new node{0, 32767, nullptr};
}
// 打印空闲区队列
void print() {
cout << "\n空闲区队列情况:" << endl;
/* cout << setw(10) << "编号" << setw(10) << "首址"
<< setw(10) << "终址" << setw(10) << "大小" << endl; */
cout<<"编号\t首址\t终址\t大小\n";
node* p = head1;
int i = 1;
while (p != nullptr) {
/* cout << setw(10) << i++ << setw(10) << p->adr
<< setw(10) << p->adr + p->size - 1
<< setw(10) << p->size << endl; */
cout << i++ << "\t" << p->adr
<< "\t"<< p->adr + p->size - 1
<< "\t" << p->size << endl;
p = p->next;
}
cout << endl;
}
// 检查释放块的合法性
bool check(int adr, int size) {
node* p = head1;
while (p != nullptr) {
// 检查释放区是否与现有空闲区重叠
if ((adr >= p->adr && adr < p->adr + p->size) ||
(adr + size > p->adr && adr + size <= p->adr + p->size) ||
(adr <= p->adr && adr + size >= p->adr + p->size)) {
return false;
}
p = p->next;
}
return true;
}
// 首次适应算法分配
void assignment1(int request) {
node* p = head1;
node* pre = nullptr;
while (p != nullptr) {
if (p->size >= request) {
// 找到足够大的空闲区
assign = new node{p->adr, request, nullptr};
// 更新空闲区
p->adr += request;
p->size -= request;
// 如果分配后剩余大小为0,则删除该空闲区
if (p->size == 0) {
if (pre == nullptr) {
head1 = p->next;
} else {
pre->next = p->next;
}
delete p;
}
cout << "分配成功!首址:" << assign->adr << ",大小:" << assign->size << endl;
return;
}
pre = p;
p = p->next;
}
cout << "分配失败!没有足够的空闲区。" << endl;
}
// 最佳适应算法分配
void assignment2(int request) {
node* p = head1;
node* pre = nullptr;
node* best = nullptr;
node* best_pre = nullptr;
int min_size = INT_MAX;
// 寻找最小的足够大的空闲区
while (p != nullptr) {
if (p->size >= request && p->size < min_size) {
min_size = p->size;
best = p;
best_pre = pre;
}
pre = p;
p = p->next;
}
if (best != nullptr) {
// 找到最佳的空闲区
assign = new node{best->adr, request, nullptr};
// 更新空闲区
best->adr += request;
best->size -= request;
// 如果分配后剩余大小为0,则删除该空闲区
if (best->size == 0) {
if (best_pre == nullptr) {
head1 = best->next;
} else {
best_pre->next = best->next;
}
delete best;
}
cout << "分配成功!首址:" << assign->adr << ",大小:" << assign->size << endl;
} else {
cout << "分配失败!没有足够的空闲区。" << endl;
}
}
// 首次适应算法的回收算法
void acceptment1(int adr, int size) {
if (!check(adr, size)) {
cout << "释放失败!释放区与现有空闲区重叠。" << endl;
return;
}
node* p = head1;
node* pre = nullptr;
while (p != nullptr && p->adr < adr) {
pre = p;
p = p->next;
}
node* new_node = new node{adr, size, p};
// 检查是否可以与前一个空闲区合并
if (pre != nullptr && pre->adr + pre->size == adr) {
pre->size += size;
// 检查是否可以与后一个空闲区合并
if (p != nullptr && adr + size == p->adr) {
pre->size += p->size;
pre->next = p->next;
delete p;
}
delete new_node;
}
// 检查是否可以与后一个空闲区合并
else if (p != nullptr && adr + size == p->adr) {
new_node->size += p->size;
new_node->next = p->next;
if (pre != nullptr) {
pre->next = new_node;
} else {
head1 = new_node;
}
delete p;
}
// 不能合并,直接插入
else {
if (pre != nullptr) {
pre->next = new_node;
} else {
head1 = new_node;
}
}
cout << "释放成功!首址:" << adr << ",大小:" << size << endl;
}
// 最佳适应算法的回收算法
void acceptment2(int adr, int size) {
// 最佳适应算法的回收与首次适应算法相同
acceptment1(adr, size);
}
int main() {
init();
int choice, algo_choice;
int request, adr, size;
cout << "动态分区分配及回收算法模拟程序" << endl;
while (true) {
cout << "\n请选择分配算法:" << endl;
cout << "1. 首次适应算法(First Fit)" << endl;
cout << "2. 最佳适应算法(Best Fit)" << endl;
cout << "0. 退出程序" << endl;
cout << "请选择:";
cin >> algo_choice;
if (algo_choice == 0) break;
if (algo_choice != 1 && algo_choice != 2) {
cout << "无效选择,请重新输入!" << endl;
continue;
}
cout << "\n请选择操作:" << endl;
cout << "1. 分配内存" << endl;
cout << "2. 回收内存" << endl;
cout << "0. 返回上级菜单" << endl;
cout << "请选择:";
cin >> choice;
if (choice == 0) continue;
switch (choice) {
case 1: // 分配内存
cout << "请输入申请内存大小:";
cin >> request;
if (request <= 0) {
cout << "无效的内存大小!" << endl;
break;
}
if (algo_choice == 1) {
assignment1(request);
} else {
assignment2(request);
}
print();
break;
case 2: // 回收内存
cout << "请输入释放内存的首址:";
cin >> adr;
cout << "请输入释放内存的大小:";
cin >> size;
if (size <= 0 || adr < 0) {
cout << "无效的输入参数!" << endl;
break;
}
if (algo_choice == 1) {
acceptment1(adr, size);
} else {
acceptment2(adr, size);
}
print();
break;
default:
cout << "无效选择,请重新输入!" << endl;
}
}
// 释放所有内存
node* p = head1;
while (p != nullptr) {
node* temp = p;
p = p->next;
delete temp;
}
if (assign != nullptr) delete assign;
if (back1 != nullptr) delete back1;
return 0;
}
浙公网安备 33010602011771号