#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;

}

posted on 2025-05-07 19:09  leapss  阅读(4)  评论(0)    收藏  举报