哈希查找表/散列表
#include <stdio.h>
#include <stdlib.h>
#include "Base.h"
int hashsize[] = {7,13,17,101,211,307,401,503,601,701,809,907,997};
#define DUPLICATE -1
#define NULLKEY -2
#define FULL -3
#define EQ(a,b) ((a)==(b))
#define Max 20
typedef struct
{
KeyType *elem;
int count;
int sizeindex;
}HashTable;
void InitHash(HashTable *H)
{
(*H).count = 0;
(*H).sizeindex = -1;
(*H).elem = NULL;
}
Status CreateHash(HashTable *H, Table T)
{
int i, tag;
InitHash(H);
RecreateHashTable(H);
i=1;
while(i<=T.length)
{
tag = InsertHash(H, T.elem[i].key);
if(tag==SUCCESS)
i++;
else
i=1;
}
return OK;
}
Status SearchHash(HashTable H, KeyType K, int *p)
{
int c, sup;
c = 0;
sup = hashsize[H.sizeindex]/2;
*p = fHash(H, K);
while(1)
{
if(H.elem[*p]==NULLKEY)
return NULLKEY;
else if(EQ(H.elem[*p], K))
return DUPLICATE;
else if(++c==sup)
return FULL;
else
collision(H, p);
}
}
Status InsertHash(HashTable *H, KeyType K)
{
int flag, p;
flag = SearchHash(*H, K, &p);
if(flag==FULL)
{
RecreateHashTable(H);
return UNSUCCESS;
}
else
{
if(flag==NULLKEY)
{
H->elem[p] = K;
++(*H).count;
}
return SUCCESS;
}
}
Status RecreateHashTable(HashTable *H)
{
int i, newv;
(*H).count = 0;
(*H).sizeindex++;
newv = hashsize[(*H).sizeindex];
if((*H).elem!=NULL)
free((*H).elem);
(*H).elem = (KeyType *)malloc(newv*sizeof(KeyType));
if((*H).elem==NULL)
return ERROR;
for(i=0; i<newv; i++)
(*H).elem[i] = NULLKEY;
return OK;
}
int fHash(HashTable H, KeyType K)
{
return K % hashsize[H.sizeindex];
}
void collision(HashTable H, int *p)
{
*p = (*p+1)%hashsize[H.sizeindex];
}
void PrintHash(HashTable H)
{
int i, v;
v = hashsize[H.sizeindex];
printf("哈希表容量为:%d,现有元素:%d 个,表中元素为:\n", v, H.count);
for(i=0; i<v; i++)
{
if(H.elem[i]!=NULLKEY)
printf("%d ",H.elem[i]);
}
printf("\n");
}
int main(int argc, char *argv[])
{
Table T;
HashTable H;
printf("创建并输出一个查找表...\n");
{
FILE *fp;
fp = fopen("TestData_Table.txt", "r");
Create(fp, &T, Max);
Traverse(T, PrintKey);
printf("\n");
}
PressEnter;
printf("▼1、2、3、4、5、6、7、8\n▲函数 CreateHash等 测试...\n");
{
printf("创建一个哈希表,并输出其中的关键字:\n");
CreateHash(&H, T);
PrintHash(H);
printf("\n");
}
PressEnter;
printf("▼\n▲查找测试...\n");
{
Status r;
KeyType key = 20;
int p = 0;
printf("查找关键字 %d ...\n", key);
r = SearchHash(H, key, &p);
if(r==DUPLICATE)
printf("查找成功,%d 在哈希表下标为 %d 的位置。\n", key, p);
else
printf("查找失败!\n");
printf("\n");
}
PressEnter;
return 0;
}