hash表的openADDRESSing的c语言实现

来源:互联网 发布:淘宝 暴走大事件 编辑:程序博客网 时间:2024/05/29 11:33
<template typename ElemType,typename Keytype>int ProbeArray[]={997,***};  //一个合适的素数序列用来open addressingtypedef struct{  ElemType *elem;  //数据元素的动态分配首地址  Int count;  // 当前数据元素个数  Int sizeindex; // 动态数组的当前容量}HashTable;#define SUCCESS 1#define UNSUCCESS 0#define DUPLICATE -1#define OK 1;typedef bool Status;typedef NULLKEY 0;Status searchHash(HashTable H,KeyType K,int&p,int&c){   p=Hash(k);   while(H.elem[p].key!=NULLKEY&&!EQ(K,H.elem[p].key))  //如果位置p处非空,并且和待插入的关键字不同      collision(p,++c);  // 改变p,解决冲突,增加冲突的计数次数c,用来探查下一个槽   if(EQ(K,H.elem[p].key)) return SUCCESS;   return UNSUCESS; // 如果所有的槽都探查完了还没找到,则错误。}//searchHashbool collision(int&p,int& c){ return true;}int Hash(int a){return 1;}Status insertHash(HashTable &H,ElemType e)   //将 e插入到hash表中{     int c=0;     //冲突次数;     p=Hash(k);     if(searchHash(H,e.key,p,c)) return DUPLICATE;  //如果找到该元素,则不需要插入     else if(c<ProbeArray[H.sizeindex]/2)  // 如果冲突次数没有达到上界         {                H.elem[p]=e;   // 如果没找到,就插入;                ++H.count;  //数据元素计数增加                return OK;         }//elseif     else  //如果冲突次数太多了,hash表盛不了了         {               //recreateHashTable(H);  //重建hash表               return UNSUCCESS;         }}