1. ListNode 及 HashTable 的类型声明
声明
typedef int ElementType;typedef unsigned int Index;struct ListNode;typedef struct ListNode* Position;struct HashTbl;typedef struct HashTbl* HashTable;HashTable InitHashTable(int TableSize);void DestroyHashTable(HashTable H);Position Find(ElementType Element, HashTable H);void Insert(ElementType Element, HashTable H);;ElementType Retrieve(Position P);
定义
struct ListNode{ ElementType Element; Position Next; };typedef Position List;struct HashTbl { int TableSize; List* TheLists; };
2. HashTable 的构建
HashTable InitHashTable(int TableSize){ HashTable H; if (TableSize < MinTableSize){ Error(" ... "); return NULL; } H = (HashTable)malloc(sizeof(struct HashTbl)); if (!H) FatalError("out of space !!!"); H->TableSize = NextPrime(TableSize); H->TheLists = (List*)malloc(sizeof(struct ListNode)*H->TableSize); for (int i = 0; i < H->TableSize; ++i){ H->TheLists[i] = (List)malloc(sizeof(struct ListNode)); if (!H->TheLists[i]) FatalError(""); else H->TheLists[i]->Next = NULL; }}
3. 插入新的结点
void Insert(ElementType Key, HashTable H){ Position Pos, NewCell; List L; Pos = Find(key, H); if (!Pos){ NewCell = (Position)malloc(sizeof(struct ListNode)); if (!NewCell) FatalError(""); L = H->TheLists[Hash(Key, H->TableSize)]; NewCell->Next = L->Next; // 插入在首部 NewCell->Element = Key; L->Next = NewCell->Next; }}