这是根据操作系统作业写的一个算法,用于模拟实现内存空间的动态分区分配,写的还是比较简单的。使用C++,创建双向链表来模拟动态分区,也当做是对C++链表的复习了。
首先来看具体动态分区结点的定义以及双向链表中方法的定义,具体需要用到的功能都如下所示:
#include<iostream>
#include<cstring>
using namespace std;
const int minsize=5; //允许的最小碎片空间大小为5
struct node //动态分区结点
{
int space; //空间大小
int address; //分区首地址
bool status; //状态号
node* prev;
node* next;
};
class doublelink //双向链表类来存储
{
public:
doublelink(int sp[],int ad[],int i,bool st[]); //构造函数
void FF(doublelink* ptr,int size);//FF算法 首次适应算法
void BF(doublelink* ptr,int size);//BF算法 最佳适应算法
void WF(doublelink* ptr,int size);//WF算法 最坏适应算法
void display(doublelink* ptr); //显示
int getlength(doublelink* ptr); //获得链表长度
void bubble(doublelink* ptr); //将链表从小到大排序
void rebubble(doublelink* ptr);//将链表从大到小排序
void addressbubble(doublelink* ptr); //将链表按照首地址从小到大排序
void deletespace(doublelink* ptr,int i);//回收内存空间
private:
int length; //记录链表长度
node* root; //头结点
node* tail; //尾结点
};
接下来是关于函数的实现,具体的用法以及思路都写在注释中了:
doublelink::doublelink(int sp[],int ad[],int i,bool st[])
//构造函数的实现
{
root=new node; //头结点中无数据
tail=new node; //尾结点中无数据
root->prev=NULL; //头结点前驱为NULL
tail->next=NULL; //尾结点后继为NULL
root->status=1; //将头尾结点均设置为永久占用状态,方便之后的排序用
tail->status=1;
node *q;
q=root;
length=i; //length记录链表的长度(不包括头和尾)
for(int j=0;j<i;j++) //利用数组构造结点
{
node *p=new node;
p->space=sp[j];
p->address=ad[j];
p->status=st[j];
q->next=p;
p->prev=q;
q=q->next;
}
q->next=tail; //记得将最后一个动态分区的后继结点指向尾结点
}
int doublelink::getlength(doublelink *ptr) //获得链表的长度
{
return ptr->length;
}
void doublelink::deletespace(doublelink* ptr,int e) //释放内存空间
{
node *cur=root->next; //利用cur结点来遍历整个空间
int target=-1; //初始化释放内存空间的大小为-1
for(int i=0;i<ptr->length;i++,cur=cur->next) //遍历寻找需要释放的结点
{
if(cur->space==e)
{
target=e; //如果找到,直接跳出循环,该节点就是Cur
break;
}
}
if(target==-1) //遍历完没有发现需要删除的结点,则输出后直接返回
{
cout<<"没有发现需要删除的内存空间"<<endl;
return