哈希库--uthash的详细讲解(附uthash相关头文件下载)
本文主要是對優秀博文的總結。
C語言本身是不附帶uthash.h頭文件的,因為C語言本身就不附帶哈希表,很多同學應該都是通過自己創建的,過程會有點復雜,今天就來講解一下uthash的使用吧,我是新手,如果有錯誤的地方,還請您慷慨指出來,謝謝。
好,現在開始就以我知道的給大家講解。
主要的講解內容就是:增加,刪除,查找,遍歷,計算哈希元素個數,哈希元素排序
對了有些同學一定迫不及待的想要頭文件了吧,那就提供給大家下載。
鏈接:https://pan.baidu.com/s/1_oXkPWvUpUv-oySzA6JMhA?
提取碼:un1z
為了照顧一些小白的同學,這里說一下怎么把下載下來的哈希庫頭文件放到C語言庫中,其實很簡單。
第一步:復制剛剛下載的頭文件,全選復制
第二步:找到C語言軟件(我的是vs2010)所存儲的位置,找到VC文件里include文件,最后打開include文件,講剛剛第一步復制的頭文件粘貼進去即可
?好了,正式進入主題。
①哈希表結構體
·?key為鍵
·name是鍵key對應的值,表示的是鍵當下所存儲的信息
·hh是hash內存使用的處理句柄,在使用的過程中,只需要對其進行定義即可,不需要為其賦值,一定要記得在結構體內定義UT_hash_handle hh;,hh可以定義為其他變量名,但一般習慣定義為hh。
·uthash庫提供的哈希表操作可實現類似于雙向鏈表的功能,可以通過結構成員體hh的hh.prev和hh.next去獲取當前結點的前一個結點或者后一個結點
②增加部分
增加還分為下面的幾個部分:
1.HASH_ADD_INT:添加鍵key為int類型
2.HASH_ADD_STR:添加鍵key為字符串類型,STR就是字符串string縮寫
3.HASH_ADD_PTR:添加鍵key為指針類型,PTR就是指針pointer縮寫
4.HASH_ADD:添加鍵key可以為任何類型
這里講解HASH_ADD_INT,其他類型的就是照葫蘆畫瓢了。
?解釋:HASH_ADD_INT函數第一個參數hash是哈希表;第二個參數key是鍵名稱字段,在哈希結構體中,我定義的鍵名稱為key,如果你定義為其他的,這里的第二個參數就用所定義的名稱;第三個參數s是指向需要增加的結構的指針,其實s就是一個哈希桶。
HASH_FIND_INT函數又是干嘛用的呢,它在這里就是為了檢查哈希表是否已經存在了需要加入的鍵key,如果存在會直接報錯。
③查找
查找的分類對應于上面增加的分類
HASH_FIND_INT函數第一個參數hash是哈希表;第二個參數&key是鍵的地址(一定要傳遞地址過去);第三個參數s是輸出變量,如果存在該鍵key的話,直接將所在的哈希桶地址賦值給s,s作為返回值返回,如果不存在直接返回NULL。說到底,HASH_FIND_INT函數就是查找鍵所在的結構指針
④刪除
如果要在哈希表中去刪除結構,那就必須傳入需要刪除結構的地址。如果只給鍵,就借助上面的查找函數獲得指向該鍵所在的結構指針。
?HASH_DEL函數第一個參數hash為哈希表;第二個參數s為指向需要刪除鍵的結構指針,直接看作是鏈表的刪除,刪除鏈表首先需要找到指向該鏈表的指針。?
?⑤排序
排序函數
HASH_SORT第一個參數是哈希表;第二個參數是比較函數。哈希表的排序原理跟qsort排序函數原理是一樣的。只要你懂得qsort理解就不難了。
?qsort函數栗子:
⑥遍歷
for語句中判斷條件只有一個參數s,也就是當s不為NULL就指向for循環,反之退出循環。hh.next是指向下一個結點,看下面鏈表的結構圖你可能就明白了。
⑦循環刪除
其中HASH_ITER函數是一個宏定義,在編譯的過程中會被替換成一個循環。
uthash.h頭文件定義的HASH_ITER函數
我來解釋一下HASH_ITER在編譯的過程中執行什么內容的,剛剛上面提到了HASH_ITER函數是一個宏定義,實際上它是一個循環,所以在編譯時會直接被替代成下面的循環。其實這個循環很簡單,先來了解一下它的參數。
HASH_ITER第一個參數為hh;第二個參數head為哈希表;第三個參數el和第四個參數tmp都是用來循環的指針。el指針時指向哈希表的頭結點的,tmp指針就是el的next指針,一直循環下去,直到哈希表的尾部。圖解:
DECLTYPE函數是?decltype(x)函數,我去查了一下這個函數,作用就是將參數類型轉換為與x相同的類型,如下:圖是盜用的,侵權可刪。
出處:C++ decltype用法詳解_qq_38196982的博客-CSDN博客_c++ decltype
⑧計算哈希表元素個數
?參數就只有一個哈希表
整體代碼:
鍵key為字符串類型:
HASH_ADD_STR;添加
HASH_FIND_STR;查找
整體栗子代碼如下:
?運行結果:
鍵key為指針類型:
HASH_ADD_PTR;添加
HASH_FIND_PTR;查找?
整體栗子代碼:?
?
運行結果:
?
最后特別感謝兩位博主,很多內容都是從他們中學到和總結的。
C開源hash代碼uthash的用法總結_jiangrongjr的博客-CSDN博客_hash_find_int
C語言哈希表uthash的使用方法詳解(附下載鏈接)_嵌入式與Linux那些事的博客-CSDN博客_uthash使用
總結
以上是生活随笔為你收集整理的哈希库--uthash的详细讲解(附uthash相关头文件下载)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: uthash
- 下一篇: UART RS232 RS485协议原理