注释如下:

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

define minsize 100 //空闲区大小与要求分配的空间差小于minisize,则空闲区全部分配;否则从空闲区划出一部分分配

using namespace std; struct use { float address;//已分分区起始地址 float length;//已分分区长度,单位为字节 string flag;//已分分区是否可用标志 char uname;//作业名 int next;//指向下一个已用分区的指针 }usetable[n];//已分配区表 struct ok { int uhead;//已分分区头指针 int utail;//已分分区尾指针 int fhead; //空闲区头指针 int ftail;//空闲区头指针 }point; //定义指针结构 struct free { float address;//空闲区起始地址 float length;//空闲区长度单位为字节 string flag;//空闲区表登记栏标志 char fname; int next;//指向下一个空闲分区的指针 }freetable[m];//空闲区表

//采用最优分配算法分配xk大小的空间 void allocate(char j, float xk) { int i, k, p, c; float ad; k = -1; i = point.fhead; c = i; 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; } if (freetable[k].length - xk <= minsize) //空闲区大小与要求分配的空间差小于minisize,则空闲区全部分配 { 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; } } return; }

//主存归还函数 voi

给下面代码进行逐条注释并运行输入案例讲解分析。#includeiostream#includestring#includeiomanip#define n 10假定系统允许的最大作业数量为n#define m 10假定系统允许的空闲区表最大为m# define minsize 100 using namespace std;struct use	float address;已分分区起始地址	flo

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

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