指向结构的指针之 “指针版的 binsearch() ”

写此程序前首先明确

#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];

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值