#include<iostream>
using namespace std;
 
 const int MaxNumber=100;
 struct Node{
  char elem;//空闲空间名称(大写字母)
  int FreePartition;//空闲空间还剩余的大小
  char Par_set[MaxNumber];//分配给的进程名称(小写字母)
 };
 Node  FreePartition[MaxNumber];
 Node  FirstPartition[MaxNumber];
 Node  CycleFirstPartition[MaxNumber];
 Node  BestPartition[MaxNumber];
 Node  WorstPartition[MaxNumber];
 int   ProcessNeed[MaxNumber];
 Node  FreePartition_temp[MaxNumber];
 int   PartitionNum,ProcessNum;
 
 //PartitionNum表示空间分区的个数,ProcessNum表示进程个数;
//@@@@@@@@@@@@@@@@@@@@@@@@@@ 输出空闲空间分配情况@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
   void print(Node* a)//输出最后分配的情况
   {
       for(int i=0;i<PartitionNum;cout<<"空闲空间名称"<<a[i].elem<<" ,  还剩余的空间大小 "<<a[i].FreePartition<<" ,  分配给的进程"<<a[i++].Par_set<<endl);  
  
   }
   void full_item(char*sourse,char item)//更新空闲分区分配的进程信息
   {
    int temp=1;//j记录总共有多少进程了;
    for(int i=0;i<MaxNumber;i++)
    {
       if(sourse[i]!='#')
     temp++;
    else break;
    }
    while(temp-->=0)
    {
        sourse[temp+1]=sourse[temp];//将已有的进程后退一个;
     
    }
    sourse[0]=item;//写入新进程;  
  
   }


//@@@@@@@@@@@@@@@@@@@@@@@@@@ 首次排序(可按照升序和降序排序)@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

   void automatic_sort(int choice)
   {
    int i=0,j=0;
    bool quit=false;
    Node source_temp;
  if(choice==0)
  {//按照升序排序;即用best first算法来进行空闲空间分区分配。
   
   for(i=0;i<PartitionNum-1;i++)
   {  
    quit=true;
    for(j=0;j<PartitionNum-(i+1);j++)
     if(BestPartition[j].FreePartition>BestPartition[j+1].FreePartition )
     {
       quit=false;
          source_temp=BestPartition[j];
       BestPartition[j]=BestPartition[j+1];
       BestPartition[j+1]=source_temp;
     
     }
    if(quit)return;
   }
  
  }

  else
  {//按照降序排序;即用worst first算法来进行空闲空间分区分配。
   
   for(i=0;i<PartitionNum-1;i++)
   { 
    quit=true;
    for(j=0;j<PartitionNum-(i+1);j++)
     if(WorstPartition[j].FreePartition <WorstPartition[j+1].FreePartition)
     {
       quit=false;
          source_temp=WorstPartition[j];
       WorstPartition[j]=WorstPartition[j+1];
       WorstPartition[j+1]=source_temp;
     
     }
    if(quit)return;
   }
  
  }
  
  
   }

 

//@@@@@@@@@@@@@@@@@@@@@@@@@@清楚已有数据 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
   
  
   void crete(){
  for(int i=0;i<PartitionNum; FreePartition_temp[i]=FreePartition[i],i++);
 
 }


//@@@@@@@@@@@@@@@@@@@@@@@@@@ 首次适应算法(first fit)@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
    bool first_fit(){
  int i=0,j=0;
  bool success_temp=false;


  for(i=0;i<ProcessNum;i++)
  { 
   success_temp=false;
   for(j=0;j<PartitionNum;j++)
   { 
    
    if(ProcessNeed[i]<=FirstPartition[j].FreePartition )
    {
     FirstPartition[j].FreePartition -=ProcessNeed[i];//更新剩余空间信息     
     full_item(FirstPartition[j].Par_set,'a'+i);//更新分配给的队列
     success_temp=true;
     break;
    }
   }
   if(!success_temp)  return false;
  } 
 
  return true;
 }


 
//@@@@@@@@@@@@@@@@@@@@@@@@@@ 循环首次适应算法(next first) @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 bool next_first(){
  int i=0,j=0;
  int next_site=0;//下次开始寻址的下标
  int cycle_num=PartitionNum;//循环次数
  bool success_temp=false;
  j=next_site;
  for(i=0;i<ProcessNum;i++)
  { 
   success_temp=false;
   cycle_num=PartitionNum;
   
   while(cycle_num--)
   { 
    j=(++next_site)%PartitionNum;    
    if(ProcessNeed[i]<=CycleFirstPartition[j-1].FreePartition)
    {
     CycleFirstPartition[j-1].FreePartition-=ProcessNeed[i]; //更新剩余空间信息      
     full_item(CycleFirstPartition[j-1].Par_set,'a'+i);//更新分配给的队列
     success_temp=true;
     break;
    }
    
   }
   if(!success_temp)  return false;
  } 
 
     return true;
 }
 
//@@@@@@@@@@@@@@@@@@@@@@@@@@ 最佳适应算法(best first)@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 bool best_first(){
  int choice=0;
  automatic_sort(choice);//先进行排序
  
  bool success_temp=false;
  for(int i=0;i<ProcessNum;i++)
  { 
   success_temp=false;
   for(int j=0;j<PartitionNum;j++)
   { 
    
    if(ProcessNeed[i]<=BestPartition[j].FreePartition)
    {
     BestPartition[j].FreePartition-=ProcessNeed[i];//更新剩余空间信息 
     full_item(BestPartition[j].Par_set,'a'+i);//更新分配给的队列
     success_temp=true;
     break;
    }
   }
   if(!success_temp)  return false;
   automatic_sort(choice);//进行排序  
  } 
 
     return true;
 }
 
//@@@@@@@@@@@@@@@@@@@@@@@@@@ 最坏适应算法(worst first)   @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 bool worst_first(){
   
  int choice=1;
  automatic_sort(choice);//先进行排序   
  bool success_temp=false;
  for(int i=0;i<ProcessNum;i++)
  { 
   success_temp=false;
   for(int j=0;j<PartitionNum;j++)
   { 
    
    if(ProcessNeed[i]<=WorstPartition[j].FreePartition)
    {
     WorstPartition[j].FreePartition-=ProcessNeed[i];//更新剩余空间信息
     full_item(WorstPartition[j].Par_set,'a'+i);//更新分配给的队列
     success_temp=true;
     break;
    }
   }
   if(!success_temp)  return false;
   automatic_sort(choice);//进行排序
   
  } 
 
     return true; 

 }
 
//@@@@@@@@@@@@@@@@@@@@@@@@@@主程序 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

 void main(){
 
  freopen("text.txt","rt",stdin);
  int choice=0;
  cout<<"算法选择:"<<endl<<"1-首次适应算法,2-循环首次适应算法,3-最佳适应算法,4-最坏适应算法"<<endl<<endl;
  //cout<<"请输入空闲分区的个数n"<<endl;
        cin>>PartitionNum;
  //cout<<"请输入进程个数m"<<endl;
  cin>>ProcessNum;

  int i=0;
  
  for( i=0;i<PartitionNum;cin>>FreePartition[i].FreePartition ,FreePartition[i].elem ='A'+i,FreePartition[i++].Par_set[0]='#');

  cout<<"初始化情况"<<endl;
  print(&FreePartition[0]);
  cout<<"!!!!!!!!!!!初始化情况"<<endl<<endl<<endl<<endl;

  for( i=0;i<ProcessNum;cin>>ProcessNeed[i++]);

  for( i=0;i<PartitionNum;WorstPartition[i]=BestPartition[i]=CycleFirstPartition[i]=FirstPartition[i]=FreePartition[i],i++);
    
  while(cin>>choice){
       cout<<"@@@@@@@@@@@@@"<<endl;
    if(choice==1){
     cout<<"首次适应算法"<<endl;
     if(first_fit()) print(&FirstPartition[0]);
     else cout<<"首次适应算法分配失败"<<endl;
    }
    else if(choice==2){ 
      cout<<"循环首次适应算法"<<endl;
     if(next_first())print( &CycleFirstPartition[0]);
     else cout<<"循环首次适应算法分配失败"<<endl;
    }
    else if(choice==3){
      cout<<"最佳适应算法"<<endl;
     if(best_first())print( &BestPartition[0]);
     else cout<<"最佳适应算法分配失败"<<endl;
    
    }
    else if(choice==4){
      cout<<"最坏适应算法"<<endl;
     if(worst_first())print( &WorstPartition[0]);
     else cout<<"最坏适应算法分配失败"<<endl;
    
    }
    else{
    cout<<"输入的选择数的choice值有错"<<endl;  
    }
    cout<<endl<<endl;
  }
 
 
 
 }

posted on 2012-11-16 16:40  叶城宇  阅读(3358)  评论(0编辑  收藏  举报