此算法为hash中比较简单的线性探测法,代码优化选项OD(无)
顺便说句,这些算法实现大多会拿我在学数据结构的时候自己实现的或者书上的,所以风格编码肯定不能和百度到的那些比,权当练练手,不过物尽其用吧,也不枉费当时特意把这些代码保存下来,嘿嘿
以下为C的算法代码:
//线性探测
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#define MAX_SIZE 13
#define b 13
char *ht[MAX_SIZE];
int stringtoint(char *key)
{
int number;
for(number=0;*key;key++)
number+=*key;
return number;
}
int f(int k)
{
return k%b;
}
char* search(char* key)
{
int current,homebucket;
homebucket=f(stringtoint(key));
for(current=homebucket;ht[current]&&strcmp(ht[current],key);)
{
current=(current+1)%b;
if(current==homebucket)
return NULL;
}
if(strcmp(ht[current],key)==0)
return ht[current];
return NULL;
}
void insert(char *key)
{
int homebucket,current;
homebucket=f(stringtoint(key));
for(current=homebucket;ht[current];)
{
current=(current+1)%b;
if(current==homebucket)
return;
}
ht[current]=(char*)malloc(sizeof(*key));
strcpy(ht[current],key);
}
int main()
{
int i;
char word[MAX_SIZE];
for(i=0;i<MAX_SIZE;i++)
{
ht[i]=NULL;
}
for(i=0;i<3;i++)
{
scanf("%s",word);
insert(word);
fflush(stdin);
}
printf("search:");
scanf("%s",word);
printf("%s\n",search(word));
for(i=0;i<MAX_SIZE;i++)
printf("%s\n",ht[i]);
system("pause");
return 0;
}
惯例,OD跟踪,往下翻,有个jmp main指令,很明显就是它啦,F7跟进去,显示如下代码
01381170 >/$ 83EC 18 sub esp, 18 ; 首先分配临时存储空间
01381173 |. A1 00303801 mov eax, dword ptr [__security_cookie]
01381178 |. 33C4 xor eax, esp
0138117A |. 894424 14 mov dword ptr [esp+14], eax
0138117E |. 33C0 xor eax, eax
01381180 |. 53 push ebx
01381181 |. 8B1D A8203801 mov ebx, dword ptr [<&MSVCR90.fflush>] ; MSVCR90.fflush
01381187 |. 55 push ebp
01381188 |. 8B2D AC203801 mov ebp, dword ptr [<&MSVCR90.__iob_func>] ; MSVCR90.__p__iob
0138118E |. 56 push esi
0138118F |. 8B35 B0203801 mov esi, dword ptr [<&MSVCR90.scanf>] ; MSVCR90.scanf
01381195 |. A3 6C333801 mov dword ptr [ht], eax ; 初始化全局变量的指针数组
.....................
......................
013811DE |. 57 push edi
013811DF |. 90 nop
013811E0 |> 8D4424 14 /lea eax, dword ptr [esp+14] ; eax指向分配存储空间中最后一个变量
013811E4 |. 50 |push eax
013811E5 |. 68 04213801 |push 01382104 ; ASCII "%s"
013811EA |. FFD6 |call esi ; scanf("%s",esp+14)
01