哈希表(初步实现)

来源:互联网 发布:字符型二维数组初始化 编辑:程序博客网 时间:2024/05/29 13:24
#include<cstdio>#include<iostream>#include<cstdlib>#include<cmath>using namespace std;#define OK 1#define ERROR 0#define TRUE 1#define FALSE 0#define Maxsize 100 //储存空间初始化分配量#define SUCCESS 1#define UNSUCCESS 0#define HASHSIZE 12 //定义散列表长为数组的长度#define NULLKEY -32768typedef int Status;typedef struct{    int *elem; //数据元素储存基址,动态的分配内存    int cnt; //当前数据元素个数}HashTable;int m; // 散列表表长,全局变量Status InitHashTable(HashTable *H){    int i;    m = HASHSIZE; //因为有HASHSIZE个元素    H->cnt = m;    H->elem = (int *)malloc(m*sizeof(int));    for(i=0;i<m;i++)        H->elem[i] = NULLKEY;//初始化    return OK;//表示初始化成功}int Hash(int key){    return key % m; //除留余数法}void InsertHash(HashTable *H,int key){    int addr = Hash(key); //求散列地址    while(H->elem[addr] != NULLKEY) //表明那个地方已经有值了,代表冲突了    {        addr = (addr + 1) % m; //找后面的空位插入    }    H->elem[addr] = key;//直到后面有空位插入}Status SearchHash(HashTable H,int key,int *addr){    *addr = Hash(key); //求散列地址    while(H.elem[*addr] != key)    {        *addr = (*addr + 1) % m;        if(H.elem[*addr] == NULLKEY || *addr == Hash(key))  //如果循环回到原点        {            return UNSUCCESS;        }    }    return SUCCESS;}int main(){    int arr[HASHSIZE] = {12,67,56,16,25,37,22,29,15,47,48,34};    int i,p,key,result;    HashTable H;    key = 39;    InitHashTable(&H);    for(i=0;i<m;i++)        InsertHash(&H,arr[i]);    result = SearchHash(H,key,&p);    if(result)        cout<<"查找"<<key<<"的地址为"<<p<<endl;    else        cout<<"查到"<<key<<"失败"<<endl;    for(i=0;i<m;i++)    {        key = arr[i];        SearchHash(H,key,&p);        cout<<"查找"<<key<<"的地址为"<<p<<endl;    }    return 0;}

0 0
原创粉丝点击