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; }}