某仓库有一排连续相邻的货位,现有多批货物需要临时存放,每批货物占用不同长度的相邻货位,其中将未放置货物的连续货位,称为一个“空闲区间”。在货物存放和搬离的过程中,可能会产生大量的“碎片区间”(碎片区间是长度小于等于10的连续货位)。为解决上述问题,小辰设计一种货位分配方案,即每次都将新货物存放在满足存放要求且最长的空闲区间的头部(不会出现货物无法存放的情况),并在货物搬离后将连续的空闲区间合并。若仓库货位长度n为100,按图a所示的操作顺序执行(操作类型为0表示存放、1表示搬离),则货物存放和搬离过程如图b所示,最终货物的存放方案存储在“区间分配表”中,如图c所示。表中区间按地址顺序存放且货物编号为“0”表示该区间为空闲区间,最终可知该存放方案的碎片区间个数为1。编写程序,根据分配方案执行货物存放或搬离操作,并统计操作后碎片区间的数量。请回答以下问题:

图a 图b 图c区间分配表 图d
(1)若仓库货位长度n为200,需要执行的货物操作流程如图d所示,则执行完流程后,“区间分配表”中碎片区间的起始地址和区间长度分别为
____(2)为了能够快速的获取到最长空闲区间的信息,小辰创建了包含所有空闲区间的空闲链表,并在货物放置和搬离过程中保持链表按照区间长度降序。为实现上述功能定义如下sort(k)函数,参数k表示待插入链表的节点地址。函数功能为将新节点插入至空闲链表中并保持降序。链表节点lst[k]中的地址k为区间的起始地址,数据域1st[k][0]为区间长度,指针域lst[k][1]、lst[k][2]分别为前驱指针和后继指针,请将以下代码补充完整。
def sort(k):
#降序链表
globalhead #可以在函数中修改head变量的值
q=-1;p=head
whilep!=-1 and lst[k][0]
q=p
p=lst[p][2]
if p==head:
lst[p][1]=k
head=k
elif p==-1:
lst[q][2]=k
else:
lst[q][2]=k
lst[p][1]=k
____
lst[k][2]=p
(3)实现上述功能的部分Python程序代码如下,请在划线处填入合适的代码。
defdelete(k):
#从空闲链表中删除地址为k的节点,同同时更新头指针head,代码略
def alloc(num,length):
global head
for i in range(len(fq)):
if fq[i][0]==headandfq[i][2]==0:
break
fq[i][1]=length
fq[i][2]=num
sy=lst[head][0]-length
①
____delete(head)
#删除头节点
ifsy>0:
fq.insert(i+1,[k,sy,0])#在i之后添加新的空闲区
lst[k]=[sy,-1,-1]#更新空闲区长度
sort(k)
def release(num):
for i in range(len(fq)):
if num==fq[i][2]:
break
②
____lst[fq[i][0]]=[fq[i][1],-1,-1]
#若区间fq[i]和fq[i+1]为相邻空闲区间则合并,并修改“区间分配表”和“空闲链表”,代码略
ifi!=0andfq[i-1][2]==0:
fq[i-1][1]+=fq[i][1]
③____
delete(fq[i-1][0])
fq.pop(i)#删除“区间分配表”索引为i的区间
sort(fq[i-1][0])
else:
sort(fq[i][0])
#按行读取操作流程,并将数据存储值列表d中,其中d[i][0]和d[i][1]分别表示区间i的货物编号和操作类型,d[i][2]表示存储操作时的货物长度。
n=200#货位长度
fq=[[0,n,0]]#区间分配表
lst=[[0,-1,-1]foriinrange(n)]#空闲链表
head=0;lst[head][0]=n
for i in range(len(d)):
if d[i][1]=="0":
alloc(int(d[i][0]),int(d[i][2]))
else:
release(int(d[i][0]))
#遍历链表1st,统计碎片区间数量并输出,代码略