實驗說明:
求採用某種分配算法(首次適應算法,循環首次適應算法,最佳適應算法,最差使用算法)實現可變存儲算法的模擬操作,並實現回收空間的操作,這裏要求使用鏈表的形式實現,建議採用最佳適應算法,首次適應算法
提示:這裏可以使用兩個鏈表,一個鏈表中存儲已經分配的內存區,另一個鏈表中存儲未分配的存儲區,回收時採用模擬回收的方法,即輸入一個內存區號,在已分配的鏈表中找到這個內存塊,刪除,併合併到另一個未分配的鏈表中,這裏要考慮回收的各種情況,即單獨的分區,可以和上面空閒區合併的分區,可以和下面空閒區合併的分區,可以和上下分區合併的分區。
其中初始數據,可以自己輸入,對於分配和回收的數據自己輸入,要求對於分配和回收的各種分支情況,均可以測試到
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()
{
顯示使用鏈表和未使用鏈表
輸入要回收的塊的編號
從已使用鏈表中刪除該塊
把該塊放入空閒鏈表中(考慮四種回收的情況,考慮合併的操作,並要求從小到大放入)
}
源代碼: