6.4 结构体指针
为了说明结构体指针和数组的某些注意事项,我们把上一节的关键字计数程序再写一次,不过这回使用指针而不是数组下标。
keytab 的外部声明不需要动,但 main 和 binsearch 确实需要修改。
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#define MAXWORD 1000
int getword(char *, int);
struct key *binsearch(char *, struct key *, int);
/* C语言关键字计数,指针版本 */
main()
{
char word[MAXWORD];
struct key *p;
while (getword(word, MAXRORD) != EOF)
if (isalpha(word[0]))
if ((p=binsearch(word, keytab, NKEYS)) != NULL)
p->count++;
for (p = keytab; p < keytab + NKEYS; p++)
if (p->count > 0)
printf("%4d %s", p->count, p->word);
return 0;
}
/* binsearch:在tab[0]...tab[n-1]中查找word */
struct key *binsearch(char *word, struct key *tab, int n)
{
int cond;
struct key *low = &tab[0];
struct key *high = &tab[n-1];
struct key *mid;
while (low <= high) {
mid = low + (high - low) / 2;
if ((cond = strcmp(word, mid->word)) < 0)
high = mid;
else if (cond > 0)
low = mid + 1;
else
return mid;
}
return NULL;
}
这里有几个地方值得一提。首先,binsearch 的声明必须指出它返回 struct key 的指针而不是(第三章版本里面的)整数;在函数原型和 binsearch 内部都声明了这一点。如果 binsearch 找到一个单词,则返回其指针;若没找到,则返回NULL。
第二,keytab 的元素现在通过指针和不是数组下标来访问。这要求对 binsearch 做大改。
low 和 high 的初始化表达式现在分别是指向表的开头和结尾的指针。
中间元素的计算不能简单地使用
mid = (low + h