1. 程式人生 > >寫給自己看的散列表(2):開放定址法

寫給自己看的散列表(2):開放定址法

delete print log null i++ == must 定義 刪除

搬運自我的CSDN https://blog.csdn.net/u013213111/article/details/88870924

1.定義
在開放定址法中,用一個數組來存儲散列表的元素,因此散列表結構Htable中有一個數組(指針)CellArray,數組中的每一個元素都是一個Hcell,Hcell中除了有data外,還有一個enum類型的字段來記錄該元素的“狀態”,為空、被使用或者已刪除。

 1 enum entrykind {Legitimate, Empty, Deleted};
 2 
 3 typedef struct cell
 4 {
 5     eletype data;
6 enum entrykind info; 7 }Hcell; 8 9 typedef struct table 10 { 11 int size; 12 Hcell *CellArray; 13 }Htable;

2.新建一個散列表
註意要將數組CellArray中的每一個元素的狀態info設置為Empty。

 1 Htable *CreateHashTable(int tsize)
 2 {
 3     Htable *H;
 4 
 5     if (tsize < MinSize) {
 6         printf("
Table size must >= %d\n", MinSize); 7 return NULL; 8 } 9 10 H = malloc(sizeof(Htable)); 11 if (H == NULL) { 12 printf("Create table failed\n"); 13 return NULL; 14 } 15 16 H->size = NextPrime(tsize); 17 H->CellArray = malloc(sizeof
(Hcell) * H->size); 18 if (H->CellArray == NULL) { 19 printf("Out of space\n"); 20 return NULL; 21 } 22 23 Hcell *pcell; 24 pcell = H->CellArray; 25 for (int i = 0; i < H->size; i++) { 26 pcell->info = Empty; 27 pcell++; 28 } 29 30 return H; 31 }

3.插入
用到的Find和Hash函數與寫給自己看的散列表(1):分離鏈接法中相同,特別點在於將info設置為Legitimate,表示該存儲空間被使用了。

 1 void Insert(Htable *H, eletype key)
 2 {
 3     uint pos;
 4     pos = Find(H, key);
 5     if (H->CellArray[pos].info != Legitimate) {
 6         H->CellArray[pos].info = Legitimate;
 7         //strcpy(H->CellArray[pos].data, key);
 8         H->CellArray[pos].data = key;
 9     }
10 }

寫給自己看的散列表(2):開放定址法