#include #include #include #define n 10 //假定系统允许的最大作业数量为n #define m 10 //假定系统允许的空闲区表最大为m #define minsize 100 using namespace std;

struct use { float address; //已分分区起始地址 float length; //已分分区长度,单位为字节 string flag; //已分分区是否可用标志 char uname; //作业名 int next; //指向下一个已用分区的指针 } usetable[n]; //已分配区表

struct free { float address; //空闲区起始地址 float length; //空闲区长度单位为字节 string flag; //空闲区表登记栏标志 char fname; int next; //指向下一个空闲分区的指针 } freetable[m]; //空闲区表

struct ok { int uhead; //已分分区头指针 int utail; //已分分区尾指针 int fhead; //空闲区头指针 int ftail; //空闲区尾指针 } point; //定义指针结构

void allocate(char j, float xk) { //采用最优分配算法分配xk大小的空间 int i, k, p, c; float ad; k = -1; i = point.fhead; do { //寻找空间大于xk的最小空闲区登记项k if(freetable[i].length >= xk && freetable[i].flag == "可用") { if(k == -1 || freetable[i].length < freetable[k].length) { k = i; } } p = c; c = i; i = freetable[i].next; } while(i != -1); //寻找最优空闲区

if(k == -1) {
    cout << "无可用空闲区" << endl;
    return;
}

//找到可用空闲区,开始分配
//若空闲区大小与要求分配的空间差小于minisize, 则空闲区全部分配
//若空闲区大小与要求分配的空间差大于minisize,则从空闲区划出一部分分配
if(freetable[k].length - xk <= minsize) {
    freetable[k].flag = "空表目";
    xk = freetable[k].length;
    ad = freetable[k].address;
    freetable[k].fname = ' ';
    freetable[k].length = 0;
    freetable[k].address = 0;
    if(k == point.fhead) {
        point.fhead = freetable[k].next;
    }
    if(k == point.ftail) {
        point.ftail = p;
    }
    if(k != point.fhead && k != point.ftail) {
        freetable[p].next = freetable[k].next;
    }
} else {
    freetable[k].length = freetable[k].length - xk;
    ad = freetable[k].address;
    freetable[k].address = freetable[k].address + xk;
    freetable[k].fname = ' ';
    freetable[k].flag = "可用";
}

//修改已分配区表
i = 0;
while(usetable[i].flag != "空表目" && i < n) { //寻找空表目
    i++;
    if(i >= n) { //无表目填写已分分区
        cout << "无表目填写已分分区,错误" << endl;
        //修正空闲区表
        if(freetable[k].flag == "空表目") { //前面找到的是整个空闲区
            freetable[k].flag = "已分配";
        } else { //前面找到的是某个空闲区的一部分
            freetable[k].length = freetable[k].length + xk;
        }
        return;
    } else { //修改已分配区表
        usetable[i].address = ad;
        usetable[i].length = xk; 
        usetable[i].flag = "已分配";
        usetable[i].uname = j;
    }
}

if(point.uhead == -1) {
    point.uhead = point.utail = i;
} else {
    usetable[point.utail].next = i;
    usetable[i].next = -1;
    point.utail = i;
}

}

void reclaim(char J) { int i, k, j, s, t, p; float S, L;

//寻找已分配区表中对应登记项
s = point.uhead;
t = s;
if(s == -1) {
    cout << "没有找到该作业" << endl;
    return;
}

while(s != -1) {
    if(usetable[s].uname == J && s < n) {
        p = t;
        k = s;
        break;
    }
    t = s;
    s = usetable[s].next;
}

if(s == -1) { //在已分配区表中找不到名字为J的作业
    cout << "找不到该作业" << endl;
    return;
}

//修改已分配区表
usetable[s].flag = "空表目";
usetable[s].uname = ' ';

//取得归还分区的起始地址S和长度L
S = usetable[s].address;
L = usetable[s].length;
usetable[s].address = 0;
usetable[s].length = 0;

if(s == point.uhead) {
    point.uhead = usetable[s].next;
    usetable[s].next = -1;
}
if(s == point.utail) {
    point.utail = p;
    usetable[p].next = -1;
}
if(s != point.uhead && s != point.utail) {
    usetable[p].next = usetable[s].next;
    usetable[s].next = -1;
}

//寻找回收分
修正下面代码:#includeiostream#includestring#includeiomanip#define n 10假定系统允许的最大作业数量为n#define m 10假定系统允许的空闲区表最大为m# define minsize 100 using namespace std; struct usefloat address;已分分区起始地址float length;已分分区长度单

原文地址: https://www.cveoy.top/t/topic/eQ5r 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录