日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

哈希库--uthash的详细讲解(附uthash相关头文件下载)

發布時間:2023/12/14 编程问答 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 哈希库--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相关头文件下载)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。