1. 阅读以下说明和C代码,将应填入
(n) 处的字句写在对应栏内。
【说明】
下面程序用来将打乱的单词还原为原来的次序,比如将rty还原为try。单词的原来次序存储于wordlist.txt文件中,原则上可用穷举法(rty对应的穷举为:rty、ryt、try、tyr、ytr、yrt),但考虑到破译速度,采用如下方法:
注意到单词列表中不存在组成字符完全相同的单词(如Hack12与Hack21包含完全相同的字符),因此将单词中的字符进行重组再进行比较,例如,try单词重组为rty(按ASCII码顺序),这样不管打乱的单词是什么顺序,只要是由r、t、y三个字母组成的均破译为try,大大提高破译速度。程序中借助二叉排序树以进一步提高查找效率,二叉排序树左子树(如果有)上的节点对应的值均小于根节点的值,右子树(如果有)上的节点对应的值均大于根节点的值。
函数中使用的符号定义如下:
#define NumberofWords 1275 //单词总数
#define MaxLength 10 //最长单词所含字符数
char WordList [NumberofWords] [MaxLength];//存储单词列表
int cmp(Node *q,Node *p);//q与p比较。p小,返回负值:p大返回正值;相等,返回0
typedef struct Node{//二叉树节点
char *eleLetters;//重组后的字符串
int index;//对应单词表中的下标
struct Node *lChild, *rChild;//左右子节点
}Node;
【C代码】 void reCompose(Node *p, char *temp)
//重组,亦即将temp字符串中的字符升序排序,存储于p节点中
//采用直接插入排序法
{
char c;
strcpy(p->eleLetters, temp);//
int len=strlen(temp);
int i, j, k;
for(i=0; i<len-1; i++){
k=i;
for(j=i+1; j<len; j++){
if(p->eleLetters[j] <p->eleLetters[k])k=j;
}
if{
(1) ){
c=p->eleLetters[i];
p->eleLetters[i]=p->eleLetters[k];
p->eleLetters[k]=c;
}//if
}//for
};
int find(Node &root, char *temp)
/ /在二叉排序树root中查找与temp匹配的单词。
//若匹配返回相应单词在WordList中下标;若查找失败, 返回-1
{
Node *p, *q;
int flag;
p=
(2) ;//临时存储
reCompose(p, temp); //将temp重组
q=&root;
while((flag=(3)) &&q!=NULL){
if(flag<0) {//搜索左子树
q=q->IChild;
}else {//搜素右子树
q=q->rChild;
}
}//while
if(flag==0){//找到匹配的, 保存下标
return
(4) ;
}
if(
(5) ){//查找失败
printf("cant unscramble the following word:%s", temp);;
return-1;
}
};
(1)k!=i
(2)(Node*)malloc(sizeofp)
(3)q->cmp(p)
(4)q->index
(5)q==NULL
[解析] 该题涉及二叉排序树的应用、直接插入排序算法等。
空(1)所在函数是直接插入排序的一个实现,理解了直接插入排序算法很容易得出答案,条件(1)成立时,需要进行交换,故空(1)应填“k!=i”。
空(2)比较简单,p声明为指针,在引用reCompse (p, temp)之前需要申请空间,故空(2)应填“(Node*)malloc(sizeof p)”。
接下来在二叉排序上进行查找。while循环体内只有两个分支,一个是flag<0时继续往左子树搜索,另一个就是往右子树搜索,此时应该对应的是flag>0。据此可判知,flag存储的是查找节点p与当前节点q之间的大小关系,显然是调用类Node的cmp方法,故空(3)应填“cmp(q,p)”。注意,不能填成“cmp(p,q)”,那样将不可能找到匹配的,因为该二叉排序树是左子树小于根节点,而cmp(q,p)当p比q小时返回负值,搜索应往左子树继续。
空(4)是找到匹配时返回,根据函数注释,函数find的返回值是匹配单词在WordList数组中的下标,结构Node的index域正好存储的是下标。故空(4)应填“q->index”。
空(5)是查找失败的情况,对应条件为“q==NULL”。故空(5)应填“q==NULL”。