问题 问答题

[说明] 散列文件的存储单位称为桶(BUCKET)。假如一个桶能存放m个记录,当桶中已有m个同义词(散列函数值相同)的记录时,存放第m+1个同义词会发生“溢出”。此时需要将第m+1个同义词存放到另一个称为“溢出桶”的桶中。相对地,称存放前m个同义词的桶为“基桶”。溢出桶和基桶大小相同,用指针链接。查找指定元素记录时,首先在基桶中查找。若找到,则成功返回,否则沿指针到溢出桶中进行查找。 例如,设散列函数为Hash(Key)=Key mod7,记录的关键字序列为15,14,21,87,96,293,35,24, 149,19,63,16,103,77,5,153,145,356,51,68,705,453,建立的散列文件内容如图2-27所示。

为简化起见,散列文件的存储单位以内存单元表示。 函数InsertToHashTable(int NewElemKey)的功能是:若新元素NewElemKey正确插入散列文件中,则返回值0;否则返回值-1。 采用的散列函数为Hash(NewElemKey)=NewElemKey%P,其中P设定基桶的数目。 函数中使用的预定义符号如下。

答案

参考答案:

解析:这是一道要求读者掌握如何在散列文件中插入一个新的数据元素的编程题。本题的解答思路如下。 在散列文件中插入一个新的数据元素的基本思路是,首先将要插入的元素代入到散列函数中,从而计算出该元素的散列地址。然后按照散列地址,在基桶中查找空闲单元,若找到,则将元素插入,若基桶已满,则在溢出桶中查找空闲单元。若溢出桶中也查找不到,则申请新的溢出桶,然后将元素存入。 在散列文件中查找一个元素的基本思路是,查找指定元素记录时,首先在基桶中查找,若找到,则成功返回,否则沿指针到溢出桶中进行查找。 在本试题中,将元素存储在预先设定的基桶或根据需要申请的溢出桶中,只要基桶中有空闲单元,就将新元素NewElemkey插入在基桶中,若基桶中无空闲单元,则看是否存在溢出桶,若存在,则在溢出桶中查找空闲单元,若不存在溢出桶或溢出桶中无空闲单元,则申请一个溢出桶并存入新元素。 在基桶查找空闲单元时,使用的桶号为Index,由此可知(1)空缺处所填写的内容是“Index=NewElemKey%P”,或“Index=Hash(NewElemKey)”等其他等价形式。 一旦在基桶中找到空闲单元,即“Bucket[1ndex].keyData[i]==NULLKEY”(0≤i<ITEMS),则可将元素NewElemkey放入Bucket[Index].keyData[i],至此元素已经插入散列桶中,函数可返回,因此(2)空缺处所填写的内容是“i<ITEMS”。反之, 若在基桶中没有找到空闲单元,则需查找溢出桶。“t=Bucket[Index].Link”,指针t首先指向桶号Index的第一个溢出桶。以下的代码完成在溢出桶中查找空闲单元的功能。

由于每个溢出桶都可以存储ITEMS个元素,因此在溢出桶中查找空闲单元与在基桶中的查找过程相同,代码如下。 若在指针t指向的溢出桶中找到空闲单元则插入元素,否则,由“t=t->Link”得到下一个溢出桶的指针,因此“k<ITEMS”可作为是否在当前溢出桶中找到空闲单元的判定条件。显然,在桶号Index的基桶和其所有溢出桶都已满的情况下,t的值为空指针。此时才需要申请新的溢出桶并建立链接关系,因此在上面查找溢出桶中空闲单元时,进行指针t的后移“t=t->Link’’前应先用front记录t的值,以便于后面建立链接关系。所以(3)空缺处应给front置初值,即所填写的内容是“front=&Bucket[Index]”,或“front=Bucket+Index”等其他等价形式。 (4)空缺处用于判断该溢出桶是否已满,即所填写的内容是“k=ITEMS(或k>=ITEMS)”。如果该溢出桶已满,则继续查找下一个溢出桶,直到查找到空闲单元为止。 若所有溢出桶都不存在空闲单元(即t==NULL),则申请新的溢出桶,并将新的溢出桶的首地址保存在原有的最后一个溢出桶的Link域中(即front->Link=s)。因此(5)空缺处所填写的内容是“t==NULL”, (6)空缺处用于建立新申请溢出桶的链接关系——“front->Link=s”。

问答题

小杰和小燕学习了碳单质的化学性质后,知道碳与氧气反应,若反应物的量不同,生成物不同.于是两人联想到木炭粉与氧化铜发生的反应可能有:

①C+2CuO

 高温 
.
 
2Cu+CO2↑②C+CuO
 高温 
.
 
Cu+CO↑

他们想来验证自己的想法,请你和他们一起进行探究:(请完成下列空白处)

(一)提出问题:木碳与氧化铜反应除生成单质铜外,另一种生成物是什么?

(二)猜想与假设:木炭粉与氧化铜反应生成物有三种可能:

(1)产物是铜和一氧化碳  (2)产物是铜和二氧化碳   (3)产物是______.

(三)设计方案:

(1)检验CO2的方法是______.(用方程式表示)

(2)如何检验产物中是否存在CO,两位同学分别提出了检验CO的方案,但都被大家否定了.请在下表中写出不可行的原因.

 检验方案不可行的原因
小杰把小动物放在收集的气体中,观察能否存活③_____________
小燕点燃生成的气体,观察能否燃烧④______________
查阅资料后,他们把滤纸浸泡在磷钼酸与氯化钯的黄色混合液中,制成试纸(试纸遇一氧化碳立刻变蓝,而遇二氧化碳不反应)

(四)实验结论:设计的实验装置(如下图1):

实验现象检验方案
A中固体由黑色变成红色有Cu生成
B中黄色试纸变蓝有⑤_____生成
C中⑥___________有CO2生成

 

(五)反思与评价:

(1)如果A装置中的试管口高于试管底部,在实验过程中可能造成的后果是______.

(2)实验结束时,为防止铜被氧化,必须先停止加热,待铜冷却后再将试管口的橡皮塞取下,因此若没有B试剂瓶,可能导致的后果是______.

(3)根据实验结论,从环保的角度考虑,上述装置C后应添加的装置是______.

(六)拓展与交流:

如果用如图2装置代替图1中的A装置,这样既可以排尽试管中的空气,又能将反应产生的气体都“赶”出来,该气体可能是______.

多项选择题