文件结束块用-1 表示,空闲盘块用 0xff 表示。
函数 regain 的功能是模拟数据恢复,找到各个文件的起始地址和大小(盘块数量),并返回以[[起始地址, 文件大小], …]形式的列表 lst。变量 allot 存储文件分配表信息。
def regain(allot):
lst=[]
visited=[] #记录 allot 的访问情况
for i in range(len(allot)):
if allot[i] != 0xff and i not in visited: #盘块 i 需要处理
fsize=0
p=i
while p!=-1 and p not in visited:
visited.append(p)
fsize+=l
p=allot[p]
if p==-1:
lst.append([i,fsize])
else:
for j in range(len(Ist)):
if lst[j][0]==p:
lst[j][0]=i
lst[j][1]=lst[j][1]+fsize
return lst
若allot为[3,7,13,9,0xff,0xff,0xff,8,-l,-l,0xff,l,0,1l,0xff,0xff],调用regain函数,
①则语句 lst[j][1]=lst[j][1]+fsize 一共会被执行次。
②如果把 while p!=-1 and p not in visited 改写为 while p!=-1,对程序的影响是(多选,填字母)。
A.会增加 while 的循环体执行次数
B.返回的 lst 中的节点数量保持不变
C.while 循环不能正常结束
D.返回的 lst 中,文件的起始地址部分不正确
如图 2所示,共有3个空闲盘区,盘块号依次为 4、5、6、10、14、15请在划线处填上合适的代码。
def mergefree(allot): #mergefree 的功能是从头到尾扫描文件分配表,创建空白盘区链
freeh=-1:freelst=[]
n=len(allot)
i=0
while i<n:
if allot[i]==0xff:
j=i+1
while
j+1
freelst.append([i,j-i,-1])
if freeh==-1:
freeh=cur=len(freelst)-1
else:
freelst[cur][2]=len(freelst)-1
i=j+l
else:
i+=l
return freeh,freelst
#读取文件分配表信息存储到 a11ot 中,代码略
head,freelst=mergefree(allot)
p=head
whi1e p!=-1: #打印出所有空闲盘块号
for i in range(freelst[p][1]):
print(,end=',')
p=freelst[p][2]