实验说明:
求采用某种分配算法(首次适应算法,循环首次适应算法,最佳适应算法,最差使用算法)实现可变存储算法的模拟操作,并实现回收空间的操作,这里要求使用链表的形式实现,建议采用最佳适应算法,首次适应算法
提示:这里可以使用两个链表,一个链表中存储已经分配的内存区,另一个链表中存储未分配的存储区,回收时采用模拟回收的方法,即输入一个内存区号,在已分配的链表中找到这个内存块,删除,并合并到另一个未分配的链表中,这里要考虑回收的各种情况,即单独的分区,可以和上面空闲区合并的分区,可以和下面空闲区合并的分区,可以和上下分区合并的分区。
其中初始数据,可以自己输入,对于分配和回收的数据自己输入,要求对于分配和回收的各种分支情况,均可以测试到
3 实验评分:
如学生程序完全正确,且程序格式规范,可读性好,建议80分以上,如果学生的部分程序虽然存在局部问题,但某些地方具有一定的改进或创新,对于这种情况,建议评分在80分以下
如果有算法不正确或调试有问题,一般成绩不高于75分,如果有大部分程序都有问题 ,或存在抄袭,则不能及格。
测试数据:输入容量:1000
申请200,100,150,50,100,
释放100,50
申请40
释放40
释放100
Struct block
{
Int no; //编号
Int begging //起始位置
Int size; //大小
Int ending; //终止位置
Struct block *next;
}
Struct block *unuse_list,*use_list; //为方便,采用带头结点的链表
Int numble; //块的编号
Void main()
{
Void require();
Void release();
Numble=0;
输入总的空间大小,初始位置默认为0
Put it into the unuselist;
Do while .t.
Printf(“*****************”);
Printf(“1 require”)
Printf(“2 release”);
Printf(“other :exit);
Printf(“*****************”);
Scanf(“%d”,&choice)
If choice= =1 require();
else
If choice= =2 release();
Else
Break;
}
Void require()
{
输入申请的空间的大小;
在未使用链表中找出第一个符合大小的空闲块
把这个空闲块的被申请部分形成的新块放入使用链表中(产生新的编号,修改块的基本信息)
If there is remainder
{delete the block from unuselist ;
重新放入未使用链表中(从小到大,修改块的基本信息);
}
}
Void release()
{
显示使用链表和未使用链表
输入要回收的块的编号
从已使用链表中删除该块
把该块放入空闲链表中(考虑四种回收的情况,考虑合并的操作,并要求从小到大放入)
}
源代码: