内存回收算法: 首先是输入你需要归还空间的地址start以及长度length,然后计算出空间的释放区下部地址len,然后循环遍历整个空间说明表,分为以下四种情况:
- 释放区下部邻接空间区
- 释放区上部邻接空闲区
- 释放区上下部都邻接空闲区
- 释放区上下部均不邻接空闲区
操作: 对于情况①,更新空间说明表最后一个元素的所有数据即可。 对于情况②,更新空间说明表第一个元素所有数据即可。 对于情况③,更新空间说明表所要释放位置前后元素的所有数据,并且将他们合并为一个。 对于情况④,重新创建一个模块,然后插入进队列即可。 代码:
#include
#include
using namespace std;
#define numUse 100 //定义空闲区说明表最多有十个可用存储空间
struct Mode{ //定义空闲区说明表
int Start; //起始地址
int Length; //长度
char State; //状态 R为未分配 F为以分配
}mode[numUse];
deque
deque
//回收存储空间算法
void HuiShou()
{
cout<<“Message:请根据空间空闲表来写入合适回收空间!”<<endl;
int start1=0; //初始化
int length1=0; //初始化
cout<<“请输入起始地址:”;
cin>>start1;
cout<<“请输入长度:”;
cin>>length1;
int len=start1+length1; //释放区下部
if(len<=((Q.begin())).Start||start1>=(((Q.end()-1)).Start+((Q.end()-1)).Length))
{
if(len<((Q.begin())).Start)
{
mode[n+q].Length=length1;
mode[n+q].Start=start1;
mode[n+q].State=‘R’;
Q.push_front(mode[n+q]);
q++;
}
else if(len==((Q.begin())).Start)
{
((Q.begin())).Start=start1;
((Q.begin())).Length+=length1;
}
else if(start1==(((Q.end()-1)).Start+((Q.end()-1)).Length))
{
((Q.end()-1)).Length+=length1;
}
else if(start1>(((Q.end()-1)).Start+((Q.end()-1)).Length))
{
mode[n+q].Length=length1;
mode[n+q].Start=start1;
mode[n+q].State=‘R’;
Q.push_back(mode[n+q]);
q++;
}
}
else{
for(pos=Q.begin();pos!=Q.end();pos++)
{
if(len==((pos+1)).Start&&start1==(*pos).Start+(*pos).Length) //释放区上下部都与空间区邻接
{
(*pos).Length+=(*(pos+1)).Length+length1;
Q.erase((pos+1));
}
else if((len<((pos+1)).Start)&&(start1>(*pos).Start+(*pos).Length))
{
mode[n+q].Start=start1;
mode[n+q].Length=length1;
mode[n+q].State=‘R’;
Q.insert(pos+1,mode[n+q]);
q++;
}
else if((len<((pos+1)).Start)&&(start1==(*pos).Start+(*pos).Length))
{
(*pos).Length+=(*(pos+1)).Length+length1;
}
else if((len==((pos+1)).Start)&&(start1>(*pos).Start+(*pos).Length))
{
((pos+1)).Start = start1;
((pos+1)).Length += length1;
}
}
}
}
结果: