標籤:作業系統 類 鏈表 合并 索引
/************************************************************************//* 功能: 類比實現可變分區儲存管理的最佳適應演算法的鏈表類定義實現時間: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);//求得能添加的空閑區間的起始adressint oldAdress = fl.getNeedAdress(i);//添加到busyLinkbl.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:25cout << "index:" << index << endl;//得到這個節點的size,adressint 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);//求得能添加的空閑區間的起始adressint oldAdress = fl.getNeedAdress(i);//添加到busyLinkbl.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:25cout << "index:" << index << endl;//得到這個節點的size,adressint 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;}
【作業系統】main.cpp