不是VIP会员,不能显示答案

题目解答

题目:
存储空间的回收算法。设在内存中已经存放了若干个作业A,B,C,D。其余的空间为可用的(如图)。

  此时,可用空间可用一个二维数组dk[1..100,1..2 ]表示,(如下表一中(a)),其中:dk[i,1]对应第i个可用空间首址,dk[i,2]对应第i个可用空间长度如上图中,dk:

  现某个作业释放一个区域,其首址为d,长度为L,此时将释放区域加入到可用空间表中。要求在加入时,若可用空间相邻时,则必须进行合并。因此出现下面的4种情况(如上图一(b)所示)。
 (1)下靠,即回收区域和下面可用空间相邻,例如,d=80,L=20,此时成为表二中的(a)。
 (2)上靠,例如,d=600,L=50,此时表成为表二中的(b)。
 (3)上、下靠,例如,d=150,L=150,此时表成为表二中的(c)。
 (4)上、下不靠,例如,d=430,L=20,此时表成为表二中的(d)。

 程序说明:对数组dk预置2个标志,即头和尾标志,成为表二中(b),这样可使算法简单,sp为dk表末地址。
程序清单:
PROGRAM GAO7_5;
 var   i,j,sp,d,l:integer;
   dk    :array[0..100,1..2]of integer;
 begin
  readln(sp);
 for i:=1 to sp do 
  readln(dk[i,1],dk[i,2]);
  dk[0,1]:=0;dk[0,2]:=0; sp:=sp+1 ;
  dk[sp,1]:=10000;dk[sp,2]:=0;readln(d,l);i:=1;
 while dk[i,1]<d do i:=i+1; i:=i-1 ;
 if(dk[i,1]+dk[i,2]=d)then
    if(d+l=dk[i+1,1])then
     begin
      dk[i,2]:= dk[i,2]+l+dk[i+1,2]  ;
      for j:=i+1 to sp-1 do
       dk[j]:=dk[j+1];
      sp:=sp-1;
      end
     else dk[i,2]:=dk[i,2]+l
else if(d+l=dk[i+1,1])then
     begin
      dk[i+1,1]:= d ;dk[i+1,2]:=dk[i+1,2]+l
     end
   else begin
     for j:=sp downto i+1 do  dk[j+1]:=dk[j];
      dk[i+1,1] :=d;   dk[i+1,2]:=l;sp:=sp+1;
    end;
 for i:=1 to sp-1 do     writeln(dk[i,1]:4,dk[i,2]:4);readln;
end.
考点:
分析:
解答:
评论:
老师: