阅读下列函数说明、图和C代码,回答问题[说明] 在进行文法分析的时候,通常需要检测一个单词是否在

12 查阅

阅读下列函数说明、图和C代码,回答问题

[说明]

在进行文法分析的时候,通常需要检测一个单词是否在我们的单词列表里。为了提高查找和定位的速度,通常都要画出与单词列表所对应的单词查找树。

程序构造一棵二叉排序树,每个节点存储一个单词,按字典序列,较小的在左子树,较大的在右子树。

函数中使用的预定义符号如下:

typedef struct TreeNode{/*二叉排序树节点*/

char *word;

struct TreeNode *left, *right;

}BNODE;

[函数]

int getWord(FILE *fpt, char *word)

/*从文件fpt中读取单词到word中,到达文件结束时返回0*/

{

char c;

c = fgetc(fpt);

if(c == EOF)return 0;

/*跳过单词间的非字母字符*/

while(!(tolower(c) >= 'a' && tolower(c) <= 'z')){

c = fgetc(fpt);

if(c == EOF)return 0;

}

/*不区分大小写*/

while(tolower(c) >= 'a' && tolower(c) <= 'z'){

*word++ = c;

c = fqetc(fpt);

}

*word = '\0';

return 1;

}

void BTree(BNODE **t, char *word)

{

BNODE *ptr, *p;

int compres;

p = NITLL;

(1) ;

while(ptr){

compres = strcmp(word, (2) );

if(!compres){

return;

}else{

(3) ;

ptr = compres > 0 ? ptr->right : ptr->left;

}

}

ptr = (BNODE*)malloc(sizeof ptr);

ptr->left = ptr->right = NULL;

ptr->word = (char*)malloc(strlen(word) + 1);

strcpy(ptr->word, word);

if(p == NULL){

(4) ;

}else if(compres > 0){

p->right = ptr;

}else{

p->left = ptr;

}

}

int main()

{

FILE *fpt;

char word[40];

BNODE *root = NULL;

if((fpt = fopen("text.in", "r")) == NULL){

printf("不能打开文件text.in! \n");

return 1;

}

while(getWord(fpt, word) == 1){

BTree (5) ;

}

fclose(fpt);

return 0;

}

参考答案:

ptr=*tptr->wordp=ptr*t=ptr&rootwordptr=*tptr->wordp=ptr*t=ptr&root,word

软考中级