用户注册



邮箱:

密码:

用户登录


邮箱:

密码:
记住登录一个月忘记密码?

发表随想


还能输入:200字
云代码 - c++代码库

课程设计报告

2013-12-23 作者: 云代码会员举报

[c++]代码库

#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;
}


网友评论    (发表评论)

共1 条评论 1/1页

发表评论:

评论须知:

  • 1、评论每次加2分,每天上限为30;
  • 2、请文明用语,共同创建干净的技术交流环境;
  • 3、若被发现提交非法信息,评论将会被删除,并且给予扣分处理,严重者给予封号处理;
  • 4、请勿发布广告信息或其他无关评论,否则将会删除评论并扣分,严重者给予封号处理。


扫码下载

加载中,请稍后...

输入口令后可复制整站源码

加载中,请稍后...