/************************************************************************/
/* 功能: 模拟实现可变分区存储管理的最佳适应算法的链表类定义实现
时间: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;
}
原文地址:http://blog.csdn.net/cutter_point/article/details/39077093