標籤:des style class blog code ext
#include<stdio.h>#include<math.h>typedef char* ElementType;typedef unsigned int Index;#define MinTableSize 15struct ListNode;typedef struct ListNode *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);void Delete(ElementType key,HashTable H);struct ListNode{ ElementType Element; Position next;};typedef Position List;struct HashTbl{ int TableSize; List *TheLists;};Index Hash(const char *key,int TableSize){ unsigned int HashVal=0; while(*key!=‘\0‘) { HashVal+=*key++; } return HashVal%TableSize;}int NextPrime(int TableSize){ int i,j=2; for(i=TableSize;i>0;i--) { while(j<sqrt(i)) { if(i%j==0) break; j++; } if(j==sqrt(i)) break; } return i;}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=NextPrime(TableSize); H->TheLists=malloc(sizeof(List)*H->TableSize); if(H->TheLists==NULL) { FatalError("Out of space!!"); } for(i=0;i<H->TableSize;i++) { //分配前端節點 H->TheLists[i]=malloc(sizeof(struct ListNode)); if(H->TheLists[i]==NULL) FatalError("Out of space!!"); else H->TheLists[i]->next=NULL; } return H;}void DestroyTable(HashTable H){ int i; for(i=0;i<H->TableSize;i++) { free(H->TheLists[i]); } free(H->TheLists); free(H);}Position Find(ElementType key,HashTable H){ Position P; List L; L=H->TheLists[Hash(key,H->TableSize)]; P=L->next; while(P!=NULL&&P->Element!=key) P=P->next; return P;}void Insert(ElementType key,HashTable H){ Position Pos,NewCell; List L; Pos=Find(key,H); if(Pos==NULL) { NewCell=malloc(sizeof(struct ListNode)); if(NewCell==NULL) { FatalError("Out of space!!"); } else { L=H->TheLists[Hash(key,H->TableSize)]; NewCell->next=L->next; NewCell->Element=key; L->next=NewCell; } }}ElementType Retrieve(Position P){ if(P==NULL) return NULL; else return P->Element;}void Delete(ElementType key,HashTable H){ Position Pos,Pre; List L; int i; Pos=Find(key,H); if(Pos==NULL) return; else { L=H->TheLists[Hash(key,H->TableSize)]; for(Pre=L;pre->next!=NUll;Pre=Pre->next) { if(Pre->next==Pos) { free(Pos->Element); free(Pos); break; } } }}