磁盘空间分配与回收
#include<iostream>
using namespace std;
#include<vector>
#include<windows.h>
vector<vector<int> > mycin()
{
cout<<"请输入初始的位置图"<<endl;
vector<vector<int> > v;
for(int i=0;i<10;i++){
vector<int> vv;
for(int j=0;j<16;j++){
int o;cin>>o;
vv.push_back(o);
}
v.push_back(vv);
}
return v;
}
void mycout(vector<vector<int> > v)
{
cout<<endl<<"此时的位示图是"<<endl;
cout<<" 磁道零 磁道一 磁道二 磁道三"<<endl;
for(int i=0;i<v.size();i++){
cout<<"柱面"<<i<<": ";
for(int j=0;j<v[i].size();j++){
if(j%4==0&&j!=0){
cout<<" ";
}
if(v[i][j]==0){
cout<<"○";
}
else{
cout<<"●";
}
}
cout<<endl;
}
}
void getroom(vector<vector<int> > &v)
{
while(1){
int n;
system("cls");
mycout(v);
cout<<"请输入要申请的盘块数:"<<endl;
cin>>n;
for(int i=1;i<v.size();i++){//转成一维数组
for(int j=0;j<v[i].size();j++){
v[0].push_back(v[i][j]);
}
}
vector<int> vv=v[0];
int a=0;
for(int i=0,s=0;i<v[0].size();i++){
if(v[0][i]==0){
int ii=i;
for(int j=0;j<n;j++){
if(v[0][ii+j]==1){//尝试分配失败,数组复原
s=0;
v[0]=vv;
break;
}
i++;s++;
v[0][ii+j]=1;
}
if(s==n){
cout<<"分配成功"<<endl;
a=1;
break;
}
}
else{
if(s!=n){
v[0]=vv;
}
else{
cout<<"分配成功"<<endl;
a=1;
break;
}
}
}
if(a==0){
cout<<"分配失败"<<endl;
}
for(int i=1;i<v.size();i++){//转成二维数组
for(int j=0;j<v[i].size();j++){
v[i][j]=v[0][v[i].size()*i+j];
}
}
while(v[0].size()>v[1].size()){
v[0].pop_back();
}
cout<<"是否继续申请盘块"<<endl;
cout<<"1---是 2---否"<<endl;
int m;cin>>m;
if(m==2) break;
}
}
void deleteroom(vector<vector<int> > &v)
{
while(1){
int a,b,c;
system("cls");
mycout(v);
cout<<"请输入想要释放盘块的柱面号、磁道号和盘块号:"<<endl;
cin>>a;cin>>b;cin>>c;
v[a][b*4+c]=0;
cout<<"是否继续释放盘块"<<endl;
cout<<"1---是 2---否"<<endl;
int m;cin>>m;
if(m==2) break;
}
}
int main()
{
vector<vector<int> > v=mycin();
deleteroom(v);
getroom(v);
}
/*
初始位置图
1 1 0 0 0 1 1 1 0 0 1 0 0 1 1 0
0 0 0 1 1 1 1 1 1 0 0 0 0 1 1 1
1 1 1 0 0 0 1 1 1 1 1 1 0 0 0 0
1 1 0 0 0 1 1 1 0 0 1 0 0 1 1 0
0 0 0 1 1 1 1 1 1 0 0 0 0 1 1 1
1 1 1 0 0 0 1 1 1 1 1 1 0 0 0 0
1 1 0 0 0 1 1 1 0 0 1 0 0 1 1 0
0 0 0 1 1 1 1 1 1 0 0 0 0 1 1 1
1 1 1 0 0 0 1 1 1 1 1 1 0 0 0 0
0 0 0 1 1 1 1 1 1 0 0 0 0 1 1 1
*/