/************************************************************************/ /* 功能: 模拟实现可变分区存储管理的最佳适应算法的链表类定义实现 时间:2014年9月1日9:25:17 作者:信管1201 1205020116 肖锋 */ /************************************************************************/ #include "Link.h" #include <iostream> #include <cstdlib> using namespace std; void showdesk() { cout << "*******************************************************" << endl; cout << "**1------初始化 **" << endl; cout << "**2------作业进入内存(最佳适应算法) **" << endl; cout << "**3------作业完成(内存回收,最佳适应算法)! **" << endl; cout << "**4------显示当前自由分区链 **" << endl; cout << "**5------显示当前内存中的作业占据的分区 **" << endl; cout << "**6------碎片拼接 **" << endl; cout << "**7------退出 **" << endl; cout << "**8------作业进入内存(循环适应算法) **" << endl; cout << "**9------作业完成(内存回收,循环适应算法) ! **" << endl; cout << "*******************************************************" << endl; } //cout<<"**2------作业进入内存(最佳适应算法) **"<<endl; void zuoYe(freeLink& fl, busyLink& bl) { char name; int size; cout << "输入作业的名字和大小" << endl; cin >> name >> size; //找到要修改的节点是第几位 int i = fl.getNeedGai(size); //求得能添加的空闲区间的起始adress int oldAdress = fl.getNeedAdress(i); //添加到busyLink bl.addNode(size, oldAdress, name); //设置第i个节点 int newFreeSize = fl.getNeedSize(i) - size; int newFreeAdress = fl.getNeedAdress(i) + size; //如果等于还要去除旧的节点 if (fl.getNeedSize(i) == size) { fl.popNeed(i); } //否则就是修改一下节点,还要要自动插入 fl.setNode(i, newFreeSize, newFreeAdress); } //cout<<"**3------作业完成(内存回收,最佳适应算法) **"<<endl; void huiShou(freeLink& fl, busyLink& bl) { char name; cout << "输入要回收的空间名字" << endl; cin >> name; //找到这个名字的节点索引 //cout<<"名字"<<endl; int index = bl.getNeedGai(name); //!出问题2014年9月3日21:47:25 cout << "index:" << index << endl; //得到这个节点的size,adress int gSize = bl.getNeedSize(index); //cout<<"gSize:"<<gSize<<endl; int gAdress = bl.getNeedAdress(index); //cout<<"gAdress:"<<gAdress<<endl; //从busyLink里面去除这个节点 bl.popNode(name); //回收到空闲分区链表去 //为空闲分区添加节点 fl.addNode(gSize, gAdress); //2014年9月2日16:42:42有问题2014年9月2日16:56:48解决 //看是否需要合并 fl.pingJie(); } //shuiPian(); void shuiPian(freeLink& fl, busyLink& bl) { //首先把busy队列的全部adress合并起来 int adress = bl.reAdress(); //然后把free链表的所有空闲节点合并 fl.heBing(adress); } //cout<<"**8------作业进入内存(循环适应算法) **"<<endl; void zuoYe2(freeLink& fl, busyLink& bl) { char name; int size; cout << "输入作业的名字和大小" << endl; cin >> name >> size; //把这个节点加入到尾部 //找到要修改的节点是第几位 int i = fl.getNeedGai(size); //求得能添加的空闲区间的起始adress int oldAdress = fl.getNeedAdress(i); //添加到busyLink bl.addNode(size, oldAdress, name); //!为free修改这个空白节点 fl.setNeed(i, size); } //循环适应算法回收作业 void huiShou2(freeLink& fl, busyLink& bl) { //回收的空闲节点直接添加到尾部节点就可以了 //首先从作业链表中去除这个节点 char name; cout << "输入要回收的空间名字" << endl; cin >> name; //找到这个名字的节点索引 //cout<<"名字"<<endl; int index = bl.getNeedGai(name); //出问题2014年9月3日21:47:25 cout << "index:" << index << endl; //得到这个节点的size,adress int gSize = bl.getNeedSize(index); //cout<<"gSize:"<<gSize<<endl; int gAdress = bl.getNeedAdress(index); //cout<<"gAdress:"<<gAdress<<endl; //从busyLink里面去除这个节点 bl.popNode(name); //然后为空闲分区链表添加节点 //回收到空闲分区链表去 //为空闲分区添加节点 fl.addNode2(gSize, gAdress); //2014年9月2日16:42:42有问题2014年9月2日16:56:48解决 //看是否需要合并 fl.pingJie2(); } int main() { freeLink fl1; busyLink bl1; int i = 0; while (i != 7) { showdesk(); cin >> i; switch (i) { case 1: cout << "初始化完成!" << endl; break; case 2: zuoYe(fl1, bl1); break; //case 8: // zuoYe2(fl1, bl1); // break; case 3: huiShou(fl1, bl1); break; case 4: //cout<<"**4------显示当前自由分区链 **"<<endl; fl1.show(); break; case 5: //cout<<"**5------显示当前内存中的作业占据的分区 **"<<endl; bl1.show(); break; case 6: //cout<<"**6------碎片拼接 **"<<endl; shuiPian(fl1, bl1); break; case 7: break; case 8: //cout << "**8------作业进入内存(循环适应算法) **" << endl; zuoYe2(fl1, bl1); break; case 9: //cout << "**9------作业完成(内存回收,循环适应算法) ! **" << endl; huiShou2(fl1, bl1); break; default: cout << "输入错误" << endl; break; } } system("pause"); return 0; }
时间: 2024-10-21 14:46:45