C語言實現雜湊表(開放位址法)

2021-09-29 23:56:41 字數 2215 閱讀 4313

筆者最近學習資料結構中的雜湊表,並用c語言簡單實現了。

此部落格旨在交流心得。

這篇部落格介紹的是開放位址法構造的雜湊表

如果要參考拉鍊法構造的雜湊表,請參考這篇文章:c語言實現雜湊表(拉鍊法)

結構體說明

typedef

struct element

element;

其中data域可以改為自定義的結構體(當然後續 main函式 部分**需要做相應修改)

key 值經由雜湊函式的計算會得到乙個對映的位址

typedef

struct table

table;

注意:elm 為乙個指向 element結構體的指標陣列 的指標(請好好理解),即建立了乙個 element 型別的指標陣列,而 elm 指向這個陣列的頭位址 故宣告為二級指標(指向指標的指標) 。

部分函式說明:

建立雜湊表函式:

table *

init_table()

return t;

}

宣告 table 型別的變數,為其開闢空間,並返回其位址。

在初始化時,對指標型別的變數要注意初始化(有的編譯器會幫你賦空,有的則不會)

插入函式

void

insert

(table *t,element * k)

//將key值插入到雜湊表中

t->elm[position]

= k;

t->count +=1

;return

;}

開放位址法的一般形式為:其中 h(key)是雜湊函式,m為表的長度

此種方法容易造成堆積。解決方法是改進雜湊函式或用使用拉鍊法(各有優劣)。

查詢函式:

int

serch

(table *t, element * k)

//查詢 value 並返回其所在的位址

return position;

}

出現以下幾種情況即判斷查詢失敗

1.對應的 position 位置的位址為空

2.遍歷整個表都沒有對應的 key 值

完整**:

#include

#include

#define remainder 13

#define size 50

typedef

struct element

element;

typedef

struct table

table;

inthash

(int key)

table *

init_table()

return t;

}void

insert

(table *t,element * k)

//將key值插入到雜湊表中

t->elm[position]

= k;

t->count +=1

;return;}

intserch

(table *t, element * k)

//查詢 value 並返回其所在的位址

return position;

}void

print_table

(table *t)

//列印部分雜湊表

printf

("\n");

}int

main()

,,,,

,};int length =

sizeof

(a)/

sizeof

(element)

;int i;

for(i=

0; i

)print_table

(t);

printf

("a[3] is locat %d\n"

,serch

(t,&a[3]

));free

(t);

}

執行截圖:

謝謝**~

雜湊表 開放位址法

雜湊表的查詢過程和建表過程相似。假設給定的值為k,根據建表時設定的雜湊函式h,計算出雜湊位址h k 若表中該位址單元為空,則查詢失敗 否則將該位址中的結點與給定值k比較。若相等則查詢成功,否則按建表時設定的處理衝突的方法找下乙個位址。如此反覆下去,直到某個位址單元為空 查詢失敗 或者關鍵字比較相等 ...

雜湊表 C語言實現

這裡不講高深理論,只說直觀感受。雜湊表的目的就是為了根據資料的部分內容 關鍵字 直接計算出存放完整資料的記憶體位址。void list find by key list,key return p 為了解決根據關鍵字快速找到元素的存放位址,雜湊表應運而生。它通過某種演算法 雜湊函式 直接根據關鍵字計算...

c語言實現雜湊表

雜湊表大家都在資料結構中學習過,應該是查詢最快的一種資料結構了,最好的情況下可以達到線性的時間複雜度。鍵key的狀態碼如果為 vt undefined 的話那麼就是這個槽位沒有被占用或者已經被刪除了 值value的狀態碼有vt true和vt false兩種,只要這個槽位已經被占用過了,那麼valu...