代码.txt

来自「主存储器空间的分配和回收。 在可变分区管理方式下」· 文本 代码 · 共 193 行

TXT
193
字号
#include<iostream> 
#include<string> 
using namespace std; 
struct Block                  //空闲链结构体 
{ 
string name;              //作业名 
int address;              //分区首地址   
int size;                  //分区大小 
int state;                 //分区转态 
struct Block *next;          //前向指针 
struct Block *front;         //后向指针 
}; 
struct Used                    //已分配分区结构体 
{ 
     Block *usedArea;         
     Used *next; 
}; 
Block *freeHead;         // 带表头附加节点的空闲链头指针 
Used *usedHead;          //带表头附加结点的已分配分区头指针 
bool InitValue()     //初始化函数 
{ 
cout<<"本程序设立的操作功能:1-申请资源 2-释放资源 3-打印信息"<<endl; 
freeHead=new   Block; 
freeHead->size=0; 
freeHead->next=NULL; 
freeHead->state=1; 
usedHead=new Used; 
Block *p=new Block; 
p->address=0; 
usedHead->usedArea=p; 
usedHead->next=NULL; 
Block *temp=new Block; 
cout<<"请先输入主存大小(k):"<<endl; 
cin>>temp->size; 
temp->address=0; 
temp->state =0; 
temp->next=freeHead; 
temp->front=NULL; 
freeHead->front=temp; 
return true; 
} 
void Display(Block *p,Used *q)    //打印信息的函数 
{ 
cout<<"已分配分区信息(作业,始址,大小):"<<endl; 
while(q!=NULL) 
{ 
   cout<<q->usedArea->name<<','<<q->usedArea->address<<','<<q->usedArea->size<<endl; 
   q=q->next; 
} 
cout<<"空闲链分区信息(始址,大小):"<<endl; 
while(p!=NULL) 
{ 
   cout<<p->address<<','; 
   cout<<p->size<<endl; 
   p=p->front; 
} 
} 
void Allocate(string reqName,int reqSize)   //分配函数 
{     
Block *p=freeHead->front ; 
Used *r1,*r2; 
while(p!=NULL) 
{ 
   if(reqSize<p->size)   //如果请求的分区的大小小于一个空闲分区的大小 
   { 
    Used *temp=new Used; 
    temp->usedArea =p; 
    Block *q=new Block; 
    *q=*p; 
    temp->usedArea ->name =reqName;   
    temp->usedArea ->size =reqSize; 
    temp->usedArea ->front =q; 
    temp->usedArea ->state =1; 
    q->size =q->size -reqSize; 
    q->address =q->address + reqSize;    
    q ->next->front=q; 
    if(q ->front!=NULL) 
    q ->front->next=q; 
    r1=usedHead; 
    r2=usedHead->next; 
    while(r2!=NULL&&r2->usedArea->address<temp->usedArea->address) 
    {r1=r2;r2=r2->next;} 
    r1->next=temp; 
    temp->next=r2; 
    break; 
   } 
   else if(reqSize==p->size)//如果请求的分区的大小等于一个空闲分区的大小 
   { 
    Used *temp=new Used; 
    temp->usedArea =p; 
    temp->usedArea ->name =reqName; 
    temp->usedArea ->state =1; 
    p->next->front =p->front ; 
    if(p->front!=NULL) 
    p->front ->next =p->next ; 
    r1=usedHead; 
    r2=usedHead->next; 
    while(r2!=NULL&&r2->usedArea->address<temp->usedArea->address) 
    {r1=r2;r2=r2->next;} 
    r1->next=temp; 
    temp->next=r2; 
    break; 
   } 
   p=p->front;

} 
if(p==NULL) 
cout<<"资源不足 请等待"<<endl; 
} 
void Recycle(string freeName)   //回收分区的函数 
{ 
Used *p=usedHead->next,*r=usedHead; 
Block *q; 
while(p!=NULL) 
{ 
   if(p->usedArea->name==freeName)//找到同名的作业后,再分四种情况讨论 
   { 
    q=p->usedArea; 
    int flag1=1,flag2=1; 
    Block *p1=freeHead->front; 
    Block *pfront,*pnext; 
    while(p1->address<q->address) 
    { 
     if(p1->address+p1->size==q->address){flag1=0;pnext=p1;} 
     p1=p1->front; 
    } 
    if(q->address+q->size==p1->address) 
    {flag2=0;pfront=p1;} 
    if(flag1==0) 
    { 
     if(flag2==0) 
     { 
      pnext->front =pfront->front; 
      pnext->size=pnext->size + q->size + pfront->size; 
      if(pfront->front!=NULL) 
      pfront ->front ->next=pnext; 
      r->next =p->next; 
     } 
      else {pnext ->size +=q->size;r->next =p->next ; } 
    } 
    else 
    { 
     if(flag2 ==0) 
     { 
      pfront ->address -=q->size; 
      pfront ->size +=q->size ; 
      r->next =p->next ; 
     } 
     else 
     { 
      Block *temp=freeHead; 
      while(temp->address <=q->address )temp=temp->front; 
      q->front =temp; 
      q->next =temp->next ; 
      q->next->front =q; 
      temp->next =q; 
      q->state =0; 
      r->next =p->next ; 
     }     
    } 
   break; 
   } 
   r=p; 
   p=p->next ; 
} 
}

int main() 
{ 
InitValue(); 
int operate;//操作符1-申请资源 2-释放资源 3-打印信息 
string name; 
int size; 
while(1) 
{ 
   cout<<"请选择操作功能"<<endl; 
   cin>>operate; 
   if(operate==1) 
   {   cout<<"请输入作业名(字符串)   空间大小(正整数)"<<endl; 
    cin>>name>>size; 
    Allocate(name,size); 
   } 
   else if(operate==2) 
   { 
    cout<<"请输入作业名(字符串)"<<endl; 
    cin>>name; 
    Recycle(name); 
   } 
   else if(operate==3) Display(freeHead->front,usedHead->next ); 
} 
return 0; 
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?