哈希表学习实例

       前面一篇博文中讲了哈希表原理,这篇博文我将用一个实例来说说哈希表的一个具体的C语言实例。就拿C语言的32个关键字做例子讲解,跟剧输入的摸一个关键字,通过哈希表快速检索出对应关键字的详细说明,比如你输入auto关键字,将得到"auto function"的查找结果。

       好了,下面将上代码一步步说明。

       第一步:准备好你的数据,注意这个并不是你的哈希表,你是要把这些数据存入到哈希表中以便查找,当然了存入肯定不是随便存就行的,前面的博文也说到了哈希表的特点就是,按照一定的规律存入,然后再按照同样的规律查找。

#define  HASHSIZE32/* 定义哈希表大小 */

/* 测试数据:c语言关键字 */
char *key_input[] = {
"auto",   "break",  "case",     "char",   "const",    "continue", "default",  "do",
"double", "else",   "enum",     "extern", "float",    "for",      "goto",     "if",
"int",    "long",   "register", "return", "short",    "signed",   "sizeof",   "static",
"struct", "switch", "typedef",  "union",  "unsigned", "void",     "volatile",  "while"  };

/* 测试数据:对应关键字的详细说明 */
char *key_help_temp[] = {
     "auto function", "break function", "case function", "char function", "const function", "continue function",
     "default function",  "do function", "double function", "else function", "enum function", "extern function",
     "float function", "for function", "goto function", "if function", "int function", "long function","register function",
     "return function", "short function", "signed function", "sizeof function", "static function", "struct function",
     "switch function", "typedef function", "union function", "unsigned function", "void function", "volatile function",

     "while function"     };

       第二步,为了让大家看的明白些,我在这里上主main,本来这步主要要说的只是存入操作的,包括如何去解决哈希冲突问题,我注释都很详细,相信聪明的读者肯定看得懂我这个这么简单的程序。(函数中红色部分)。

       第三步,哈希查找过程。这只是测试程序用的,看看能否根据给定的关键字直接定位出相应的关键字说明,和第二步是一个一样的过程,这整好再次强调了哈希表快速查找的本质:按照一定的规律存入,然后再按照同样的规律查找(函数中蓝色部分)

/**********************************************************
 函数原型:int main(int argc,char *argv[])
 功能描述:哈希表测试程序:输入一个C语言关键字,快速提示这个
  关键字的功能及用法
 输入参数:int argc:参数个数
  char *argv[]:参数列表
 输出参数:无
 维护记录:V1.0 hongbo.liu@shenzhen sunplus 2013-8-29
***********************************************************/
int main(int argc,char **argv) 
{
     char key_help[HASHSIZE][100]={""};/* 关键字说明的存储空间 */
     char val_flag[HASHSIZE][20]={""};/* 标志已占用存储单元 */
     unsigned int pos_hash;/* 通过hash计算出的下标 */
     unsigned int pos_conflict;/* 冲突解决后的最终下标 */
     int  i; /* 循环使用 */
     int  key_size;/* 关键字的个数 */


     /* 计算关键字个数 */
     key_size = sizeof(key_input) / sizeof(key_input[0]);

     /* 将数据存入哈希表 */
     printf("\n==================开始存放数据=================\n");
     for (i = 0;i < key_size; i++)
     {
          /* 调用“哈希、散列函数”得到坐标 */
          pos_hash = hash(key_input[i]);
          /* 冲突检测以及冲突处理函数,得到冲突解决后的最终下标 */
          pos_conflict = conflict_deal(pos_hash,val_flag,"");
          /* 进行相应的标记,“这个位置已经有数据进行存放” */
          strcpy( val_flag[pos_conflict] , key_input[i] );
          /* 按照坐标存放相应的数据到相应的位置 */
          strcpy( key_help[pos_conflict] , key_help_temp[i] );
          /* 查看存入结果 */
          printf("key_input=%s,\n pos_hash = %d,\n pos_conflict=%d,
\n val_falg[%d]=%s,----->%s\n\n",\

          key_input[i],pos_hash,pos_conflict,\
          pos_conflict,\
          val_flag[pos_conflict],\
          key_help[pos_conflict]);
     }


     /* 从哈希表中快速查找数据 */
     printf("\n==================开始查找数据=================\n");
     for (i = 0; i < key_size; i++)//
     {
          /* 调用“哈希、散列函数”得到坐标 */
          pos_hash = hash(key_input[i]);
          /* 冲突检测以及冲突处理函数,得到冲突解决后的最终下标 */
          pos_conflict = conflict_deal(pos_hash,val_flag,key_input[i]);
          /* 打印查找结果 */
          printf("key_input=%s,\npos_hash = %d,\npos_conflict=%d,\n\
          \rval_falg[%d]=%s,----->%s\n\n",\
          key_input[i],pos_hash,pos_conflict,\
          pos_conflict,\
          val_flag[pos_conflict],\
          key_help[pos_conflict]);
     }

     return 0;
}

/**********************************************************
 函数原型:unsigned int hash(char *key_input_temp)
 功能描述:哈希函数,从数据成员中通过一定的哈希散列方法得到
  哈希值
 输入参数:char *key_input_temp:给定的数据成员
 输出参数:哈希值
 维护记录:V1.0 hongbo.liu@shenzhen sunplus 2013-8-29
***********************************************************/
unsigned int hash(char *key_input_temp)
{
     unsigned int hashval = 0;/* 哈希值初始化为0 */

     /* 通过一定的哈希散列方法得到哈希值 */
     for ( ;*key_input_temp != '\0'; key_input_temp++)
     {
          hashval += *key_input_temp;
     }
     /* 返回哈希下标(0-31) */
     return (hashval % HASHSIZE);
}
/**********************************************************
 函数原型:unsigned int conflict_deal(unsigned int pos_hash_temp,
  char val_flag[][20],char *val_flag_data)
 功能描述:进行冲突判断,以及冲突解决
 输入参数:pos_hash_temp:哈希函数得得到的下标值
  val_flag[][20]:数据存放标志数组
  val_flag_data:冲突的标志,即什么样的数据才代表着冲突
  当存放数据时,为"",当获取数据时,为相应的关键字,用来
  代表这是否就是那么想要的数据的下标。
 输出参数:冲突处理过后的真正的下标
 维护记录:V1.0 hongbo.liu@shenzhen sunplus 2013-8-29
***********************************************************/
unsigned int conflict_deal( unsigned int pos_hash_temp,char val_flag[][20],char *val_flag_data)
{
     int i = 0;/* 初始化哈希冲突处理下标为0 */

     /* 循环判断指定下标内对应的数据单元是否已有数据,有则判断下一个,没有则返回 */
     while( strcmp( val_flag[pos_hash_temp],val_flag_data ) != 0 )
     {
          /* 哈希冲突处理下标加1 */
          i++;
          /* 冲突处理,存储单元(下标)偏移 */
          pos_hash_temp = (pos_hash_temp + i) % HASHSIZE;
     }
     /* 返回冲突处理过后的真正的下标 */
     return pos_hash_temp;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值