写此程序前首先明确
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define lim sizeof keytab/sizeof keytab[0]
struct key
{
char* word ;
int count ;
};
struct key keytab[] =
{
{"char",0},
{"double",0},
{"enum",0},
{"float",0},
{"int",0},
{"long",0},
{"short",0},
{"signed",0},
{"struct",0},
{"union",0},
{"unsigned",0}
};
①:指针之间的“加法运算是非法的“,“而减法运算却是合法的”
②:虽然keytabC语言的定义保证数组末尾之后的第一个元素 &keytab[lim] 的指针算数运算可以正确执行。
③:个数 = 首减尾+1
Code如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define lim sizeof keytab/sizeof keytab[0]
struct key
{
char* word ;
int count ;
};
struct key keytab[] =
{
{"char",0},
{"double",0},
{"enum",0},
{"float",0},
{"int",0},
{"long",0},
{"short",0},
{"signed",0},
{"struct",0},
{"union",0},
{"unsigned",0}
};
struct key*
binsearch(char* , struct key* );
int main()
{
char* word = "float";
struct key* temp1 = keytab ;
struct key*temp2 = binsearch(word , temp1);
if(temp2!=NULL)
{
printf("%d\n",temp2->count);
printf("%c\n",temp2->word[0]);
}
system("pause");
return 0;
}
struct key*
binsearch(char* word1,struct key* keyt)
{
struct key* low = keyt;
struct key* high = &keyt[lim];
struct key* mid ;
int cond;
while(low < high)
{
mid = low + (high-low)/2;
if((cond = strcmp(word1 , mid->word)) > 0)
low = mid +1 ;
else if((cond = strcmp(word1 , mid->word)) < 0)
high = mid ;
else
{
mid->count++;
return mid;
}
}
return NULL ;
}
其中主要解释一下:① mid = low + (high - low)/2 ; ② high = mid ;
解释情况如下图所示:①:假设数组中有7个元素,low = array;high = &array[7], 而 mid = &array[4];