文档介绍:存储管理上机作业——最佳适应算法以最佳适应为例,给出可变式分区的分配回收算法。源程序如下:#include<>#defineN5structfreearea{ intstartaddress; intsize; intstate;}freeblock[N]={{20,20,1},{80,30,1},{160,10,1},{200,40,0},{250,50,1}};intallocate(intapplyarea){ inti,tag=0; for(i=0;i<N;i++) { if(freeblock[i].size>applyarea&&freeblock[i].state==1) { freeblock[i].startaddress=freeblock[i].startaddress+applyarea; freeblock[i].size=freeblock[i].size-applyarea; tag=1;//有满足条件的分区时,tag置1 returnfreeblock[i].startaddress-applyarea; } elseif(freeblock[i].size==applyarea&&freeblock[i].state==1) { freeblock[i].state=0; tag=1;//有满足条件的分区时,tag置1 returnfreeblock[i].startaddress; } } if(tag==0) return-1;}voidset_free(){ inti,j,s,l,tag1=0,tag2=0,tag3=0; printf("pleaseinputthestartaddressyouwanttosetfree:\n"); scanf("%d",&s); printf("pleaseinputthesize:\n"); scanf("%d",&l); for(i=0;i<N;i++) { if(freeblock[i].startaddress+freeblock[i].size==s&&freeblock[i].state==1)//释放区与某一空闲块的高地址相邻接{ l=freeblock[i].size+l; tag1=1;//释放区与某一空闲块的高地址相邻接 for(j=0;j<N;j++)//内层循环用于检测释放区是否同时与两个空闲块相邻接{ if(freeblock[j].startaddress==freeblock[i].startaddress+l&&freeblock[j].state==1) { freeblock[j].size=l+freeblock[j].size; freeblock[j].startaddress=freeblock[i].startaddress; freeblock[i].state=0; tag2=1;//标记同时与两个空闲块相接 break; } } if(tag2==0) { freeblock[i].startaddress=s; freeblock[i].size=l; break; } } }//for if(tag1==0)//不与空闲块的高地址相接 { for(i=0;i<N;i++)//检测是否与某空闲块的低地址相接