HashSearch 的实现

面这段代码的哈希实现体我觉得有不是很托的地方,哈希表建立最好只存放键值,不用把关键词结构也放进去,因为哈希表大小一般为关键词表的很多倍,为了散列效果好,你必须吧键值表高的大点以实现很好的散列。这里的程序把关键词也放进哈希表中但是却没用,我觉得不是很好的实现方式,分开,做成两个不同的表,实现效果可能更好~

  1 ExpandedBlockStart.gif ContractedBlock.gif /**/ /*
  2InBlock.gif* Copyright (c) 2005 All rights reserved.
  3InBlock.gif* 文件名:HashSearch.c
  4InBlock.gif*
  5InBlock.gif* 文件标识:HashSearch
  6InBlock.gif* 摘要:一个简单的哈希表搜索示例
  7InBlock.gif* 输入:员工的ID
  8InBlock.gif* 输出:根据输入的ID查找员工资料并输出,若没有找到给出相应提示
  9InBlock.gif*
 10InBlock.gif* 当前版本 0.01
 11InBlock.gif* 作者:罗
 12InBlock.gif* 完成日期:2006年3月28日
 13ExpandedBlockEnd.gif*/

 14 None.gif
 15 None.gif#include  < stdio.h >
 16 None.gif#include  < stdlib.h >
 17 None.gif #define  HASHSIZE 11
 18 None.gif
 19 ExpandedBlockStart.gifContractedBlock.gif /**/ /* 哈希表元素的结构定义 */
 20 None.giftypedef  struct
 21 ExpandedBlockStart.gifContractedBlock.gif dot.gif {
 22InBlock.gifint ID;
 23InBlock.gifchar *name;
 24InBlock.giffloat salary;
 25ExpandedBlockEnd.gif}
 employee;
 26 None.gif
 27 None.giftypedef employee DataType;
 28 None.gif
 29 ExpandedBlockStart.gifContractedBlock.gif /**/ /* 定义一个全局的,元素类型为 employee 的哈希表 */
 30 None.gifDataType Hash[HASHSIZE];
 31 None.gif
 32 ExpandedBlockStart.gifContractedBlock.gif /**/ /*
 33InBlock.gif函数名:Create_Hash
 34InBlock.gif参数:employees为员工资料数组, size为数组大小
 35InBlock.gif功能:将大小为size的员工资料数组按员工ID映射到Hash表
 36ExpandedBlockEnd.gif*/

 37 None.gif void  Create_Hash(DataType  * employees,  int  size);
 38 None.gif
 39 ExpandedBlockStart.gifContractedBlock.gif /**/ /*函数名:HashFun
 40InBlock.gif参数:key为员工ID
 41InBlock.gif功能:将员工ID映射为Hash表中的下标地址
 42InBlock.gif返回值:返回给定关键字对应的Hash表下标地址
 43ExpandedBlockEnd.gif*/

 44 None.gif int  HashFun( int  key);
 45 None.gif
 46 ExpandedBlockStart.gifContractedBlock.gif /**/ /*函数名:HashSearch
 47InBlock.gif参数:key为员工的ID
 48InBlock.gif功能:在Hash表中搜索给定关键字的员工信息
 49InBlock.gif返回值:找到返回1,并输出员工资料, 找不到返回0并提示没有找到
 50ExpandedBlockEnd.gif*/

 51 None.gif int  HashSearch( int  key);
 52 None.gif
 53 ExpandedBlockStart.gifContractedBlock.gif /**/ /*函数名:OverHandle
 54InBlock.gif参数:address发生冲突Hash表下标地址
 55InBlock.gif功能:
 56InBlock.gif返回值:
 57ExpandedBlockEnd.gif*/

 58 None.gif int  OverHandle( int  address);
 59 None.gif
 60 ExpandedBlockStart.gifContractedBlock.gif /**/ /*函数名:printemployee
 61InBlock.gif参数:一个员工资料结构的指针
 62InBlock.gif功能:屏幕输出员工资料
 63InBlock.gif返回值:无
 64ExpandedBlockEnd.gif*/

 65 None.gif void  printemployee(DataType  * employee)
 66 ExpandedBlockStart.gifContractedBlock.gif dot.gif {
 67InBlock.gifprintf("ID : %d \t Name: %s\t Salary:%f\n",
 68InBlock.gifemployee->ID, employee->name, employee->salary);
 69ExpandedBlockEnd.gif}

 70 None.gif
 71 None.gif int  main( int  argc,  char *  argv[])
 72 ExpandedBlockStart.gifContractedBlock.gif dot.gif {
 73InBlock.gifint size;
 74InBlock.gifint key1;
 75InBlock.gifstatic char ch;
 76ExpandedSubBlockStart.gifContractedSubBlock.gif/**//* 员工资料数组 */
 77ExpandedSubBlockStart.gifContractedSubBlock.gifDataType employee[] = dot.gif{
 78ExpandedSubBlockStart.gifContractedSubBlock.gifdot.gif{11"luojiafeng"5000},
 79ExpandedSubBlockStart.gifContractedSubBlock.gifdot.gif{37"wangqian"8000},
 80ExpandedSubBlockStart.gifContractedSubBlock.gifdot.gif{48"liujie"6000},
 81ExpandedSubBlockStart.gifContractedSubBlock.gifdot.gif{97"gaoxing"10000},
 82ExpandedSubBlockStart.gifContractedSubBlock.gifdot.gif{86"xiaozhen"6000},
 83ExpandedSubBlockStart.gifContractedSubBlock.gifdot.gif{26"chenghu"8800}
 84ExpandedSubBlockEnd.gif}
;
 85ExpandedSubBlockStart.gifContractedSubBlock.gif/**//* 数组元素个数 */
 86InBlock.gifsize = sizeof(employee) / sizeof(employee[0]);
 87InBlock.gif
 88ExpandedSubBlockStart.gifContractedSubBlock.gif/**//* 将员工资料数组映射到哈希表 */
 89InBlock.gifCreate_Hash(employee, size);
 90InBlock.gif
 91ExpandedSubBlockStart.gifContractedSubBlock.gif/**//* 输入一个员工的ID,查找并显示相关信息 */
 92InBlock.gifprintf("请输入一位员工的ID:\n");
 93InBlock.gifscanf("%d"&key1);
 94InBlock.gifHashSearch(key1);
 95ExpandedBlockEnd.gif}

 96 None.gif
 97 None.gif void  Create_Hash(DataType  * employees,  int  size)
 98 ExpandedBlockStart.gifContractedBlock.gif dot.gif {
 99InBlock.gifint i, j;
100ExpandedSubBlockStart.gifContractedSubBlock.gifDataType empty = dot.gif{0, NULL, 0.0};
101InBlock.giffor (i = 0; i < HASHSIZE; i++)
102ExpandedSubBlockStart.gifContractedSubBlock.gifdot.gif{
103InBlock.gifHash[i] = empty;
104ExpandedSubBlockEnd.gif}

105InBlock.giffor (i = 0; i < size; i++)
106ExpandedSubBlockStart.gifContractedSubBlock.gifdot.gif{
107InBlock.gif= 0;
108InBlock.gifwhile (j < HASHSIZE)
109ExpandedSubBlockStart.gifContractedSubBlock.gifdot.gif{
110ExpandedSubBlockStart.gifContractedSubBlock.gif/**//* 根据员工ID,将员工资料存放到哈表 */
111InBlock.gifif (Hash[(employees[i].ID % HASHSIZE) + j].ID == 0)
112ExpandedSubBlockStart.gifContractedSubBlock.gifdot.gif{
113InBlock.gifHash[(employees[i].ID % HASHSIZE) + j] = employees[i];
114InBlock.gifbreak;
115ExpandedSubBlockEnd.gif}

116ExpandedSubBlockStart.gifContractedSubBlock.gif/**//* j++表示发生了冲突 */
117InBlock.gifelse
118InBlock.gifj++;
119ExpandedSubBlockEnd.gif}

120ExpandedSubBlockEnd.gif}

121ExpandedBlockEnd.gif}

122 None.gif
123 None.gif int  HashFun( int  key)
124 ExpandedBlockStart.gifContractedBlock.gif dot.gif {
125InBlock.gifreturn key % HASHSIZE;
126ExpandedBlockEnd.gif}

127 None.gif
128 None.gifDataType HashValue( int  key)
129 ExpandedBlockStart.gifContractedBlock.gif dot.gif {
130InBlock.gifreturn Hash[key % HASHSIZE];
131ExpandedBlockEnd.gif}

132 None.gif
133 None.gif int  HashSearch( int  key)
134 ExpandedBlockStart.gifContractedBlock.gif dot.gif {
135InBlock.gifDataType temp;
136InBlock.gifint address, count = 0;
137InBlock.gifaddress = HashFun(key);
138InBlock.gifcount++;
139InBlock.giftemp = HashValue(address);
140InBlock.gifif (temp.ID == key)
141ExpandedSubBlockStart.gifContractedSubBlock.gifdot.gif{
142InBlock.gifprintemployee(&temp);
143InBlock.gifreturn 1;
144ExpandedSubBlockEnd.gif}

145InBlock.gifelse if (temp.ID == 0)
146ExpandedSubBlockStart.gifContractedSubBlock.gifdot.gif{
147InBlock.gifprintf("没有找到与您输入ID相关的记录!\n");
148InBlock.gifreturn 0;
149ExpandedSubBlockEnd.gif}

150InBlock.gifelse
151ExpandedSubBlockStart.gifContractedSubBlock.gifdot.gif{
152InBlock.gifwhile (count < HASHSIZE)
153ExpandedSubBlockStart.gifContractedSubBlock.gifdot.gif{
154InBlock.gifaddress = OverHandle(address);
155InBlock.giftemp = HashValue(address);
156InBlock.gifif (temp.ID == key)
157ExpandedSubBlockStart.gifContractedSubBlock.gifdot.gif{
158InBlock.gifprintemployee(&temp);
159InBlock.gifreturn 1;
160ExpandedSubBlockEnd.gif}

161InBlock.gifcount++;
162ExpandedSubBlockEnd.gif}

163ExpandedSubBlockEnd.gif}

164InBlock.gifreturn 0;
165ExpandedBlockEnd.gif}

166 None.gif
167 None.gif int  OverHandle( int  address)
168 ExpandedBlockStart.gifContractedBlock.gif dot.gif {
169InBlock.gifreturn (address+1% HASHSIZE;
170ExpandedBlockEnd.gif}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值