筆者最近學習資料結構中的雜湊表,並用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...