首页 > 代码库 > 数据结构与算法分析-开放定址散列表的实现
数据结构与算法分析-开放定址散列表的实现
#include<stdio.h>#include"fatal.h"typedef char* ElementType;typedef unsigned int Index;typedef Index Position;struct HashTbl;typedef struct HashTbl *HashTable;HashTable InitializeTable(int TableSize);void DestroyTable(HashTable H);Position Find(ElementType key,HashTable H);void Insert(ElementType key,HashTable H);ElementType Retrieve(Position P,HashTable H);HashTable Rehash(HashTable H);enum KindOfEntry {Legitimate,Empty,Deleted};struct HashEntry{ ElementType Element; enum KindOfEntry Info;};typedef struct HashEntry Cell;struct HashTbl{ int TableSize; Cell *TheCells;};int MinTableSize=23;HashTable InitializeTable(int TableSize){ HashTable H; int i; if(TableSize<MinTableSize) { Error("Table size too small!"); return NULL; } H=malloc(sizeof(struct HashTbl)); if(H==NULL) FatalError("Out of space !!!"); H->TableSize=TableSize; H->TheCells=malloc(sizeof(Cell)*H->TableSize); if(H->TheCells==NULL) FatalError("Out of space !!"); for(i=0;i<H->TableSize;i++) H->TheCells[i].Info=Empty; return H;}int Hash(ElementType key,int TableSize){ unsigned int HashVal=0; while(*key!=‘\0‘) { HashVal=(HashVal<<5)+*key++; } HashVal=HashVal%TableSize; return HashVal;}Position Find(ElementType key,HashTable H){ Position CurrentPos; int CollisionNum; CollisionNum=0; CurrentPos=Hash(key,H->TableSize); while(H->TheCells[CurrentPos].Info!=Empty&&H->TheCells[CurrentPos].Element!=key) { CurrentPos+=2*++CollisionNum-1; if(CurrentPos>=H->TableSize) CurrentPos-=H->TableSize; } return CurrentPos;}void Insert(ElementType key,HashTable H){ Position Pos; Pos=Find(key,H); if(H->TheCells[Pos].Info!=Legitimate) { H->TheCells[Pos].Info=Legitimate; H->TheCells[Pos].Element=key; }}ElementType Retrieve(Position P,HashTable H){ if(H->TheCells[P].Info!=Empty) return H->TheCells[P].Element; else return NULL;}HashTable rehash(HashTable H){ int i,OldSize; Cell* OldCells; OldCells=H->TheCells; OldSize=H->TableSize; H=InitializeTable(2*OldSize); for(i=0;i<OldSize;i++) if(OldCells[i].Info==Legitimate) Insert(OldCells[i].Element,H); free(OldCells); return H;}
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。