C語言實現對哈希表的操作:創建哈希表與擴容哈希表

一. 簡介

前面文章簡單了解了哈希表 這種數據結構,文章如下:

什么是哈希表-CSDN博客

本文來學習一下哈希表,具體學習一下C語言實現對哈希表的簡單實現。

二.?C語言實現對哈希表的操作

1. 哈希表

哈希表(Hash Table,又稱散列表)是一種高效的數據結構,用于實現鍵值對(Key-Value)的存儲和快速查找。其核心思想是通過哈希函數將鍵(Key)映射到數組的特定位置(稱為“桶”或“槽”),從而在平均情況下實現接近常數時間復雜度(O(1))的插入、刪除和查找操作。

2. C語言實現哈希表操作

(1) 定義哈希表節點結構體與哈希表結構體
#define  HASH_TABLE_LENGTH  20   //鏈表容量
#define  LOAD_FACTOR        0.85 //負載因子//哈希表節點結構
typedef struct hash_node {char *key; //鍵int value; //值struct hash_node* next; //下一個節點指針(用于解決沖突)
} hash_node;//哈希表結構
typedef struct hash_table {hash_node** buckets; //桶數組size_t size; //當前元素數量size_t capacity; //哈希表長度
} hash_table;

hash_node結構體表示每個鍵值對,hash_table表示每個桶,每個桶中存放一個鏈表。

(2) 創建哈希表,擴容哈希表容量
//創建哈希表
hash_table* create_hash_table(void) {hash_table* hash_tables = (hash_table*)malloc(sizeof(hash_table));if(!hash_tables) {printf("hash_table malloc failed!\n");return NULL;}hash_tables->size = 0;hash_tables->capacity = HASH_TABLE_LENGTH;hash_tables->buckets = (hash_node**)calloc(hash_tables->capacity, sizeof(hash_node*));if(!hash_tables->buckets) {printf("hash_tables->buckets calloc failed!\n");return NULL;}return hash_tables;
}//哈希函數的實現(djb2哈希算法)
unsigned long hash_func(const char* str) {unsigned long hash = 5381;int c;while((c = *str++)) {hash = ((hash << 5)+hash)+c;}return hash;
}//調節哈希表長度(擴容)
int resize_hash_table(hash_table* hash_tables, size_t new_capacity) {//分配新桶數組hash_node** new_buckets = (hash_node**)calloc(new_capacity, sizeof(hash_node*));if(!new_buckets) {printf("new_buckets calloc failed!\n");return -1;}int i = 0;//遍歷原有桶數組,并重新哈希for(i = 0; i < hash_tables->capacity; i++) {hash_node* node = hash_tables->buckets[i];while(node != NULL) {hash_node* tmp_node = node->next;unsigned long new_index = hash_func(node->key)/ new_capacity;//采用頭插入法,插入到新桶中node->next = new_buckets[new_index];new_buckets[new_index] = node;//遍歷下一個元素node = tmp_node;}}hash_tables->buckets = new_buckets;hash_tables->capacity = new_capacity;free(hash_tables->buckets);return 0;
}

創建哈希表比較簡單,這里不做說明。

調整哈希表容量接口這里進行一下說明:

首先,分配新哈希表的容量。

其次,遍歷原來哈希表中所有元素(鍵值對),將舊的哈希表中元素插入到哈希表新桶中。由于哈希表的容量發生了改變,原有的鍵值對需要重新計算哈希值并插入到新的哈希表中。

node->next = new_buckets[new_index]; 
new_buckets[new_index] = node;

這兩行代碼的作用是將當前處理的哈希表節點 node 插入到新哈希表的對應桶(bucket)中,采用的是頭插法。

node->next = new_buckets[new_index];
  • 含義:將當前節點 nodenext 指針指向新哈希表中對應桶的頭節點。
  • 作用:這一步是為了把當前節點插入到新桶的頭部。若新桶原本為空,new_buckets[new_index] 會是 NULL,那么 node->next 就會被設為 NULL;若新桶已經有節點存在,new_buckets[new_index] 就會指向桶中的頭節點,此時 node->next 就會指向這個頭節點。
new_buckets[new_index] = node;
  • 含義:把新哈希表中對應桶的頭節點更新為當前節點 node
  • 作用:經過這一步,當前節點 node 就成為了新桶的頭節點。原本新桶中的節點(如果有的話)就變成了 node 的后繼節點。

(3) 向哈希表中插入新的鍵值對

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/902888.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/902888.shtml
英文地址,請注明出處:http://en.pswp.cn/news/902888.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

UML 活動圖詳解:以機票預訂系統用戶注冊為例

目錄 一、UML 活動圖的基本元素 二、題目原型 三、機票預訂系統用戶注冊的活動圖分析 四、活動圖繪畫 五、總結 在軟件開發過程中&#xff0c;UML&#xff08;統一建模語言&#xff09;活動圖是一種非常重要的工具&#xff0c;它能夠幫助我們清晰地理解系統的業務流程和工…

FX10(CYUSB4014)USB3.2(10Gbps)開發筆記分享(1):硬件設計與開發環境搭建

作者&#xff1a;Hello&#xff0c;Panda 大家早上好&#xff0c;中午好&#xff0c;下午好&#xff0c;晚上好&#xff0c;熊貓君又來了。這次計劃做一個連載&#xff0c;大概6期左右&#xff0c;主要介紹英飛凌最新的FX5/10/20的器件應用。目前&#xff0c;熊貓君手上調試的…

前端項目部署

一、本地服務器部署&#xff1a; 解決頁面刷新404問題&#xff1a; 1、使用 hash 模式 2、當路徑不匹配的時候&#xff0c;直接訪問 index.html 3、使用插件&#xff1a;connect-history-api-fallback https://www.npmjs.com/package/connect-history-api-fallback npm ins…

觀測云數據在Grafana展示的最佳實踐

背景 在當今的數據驅動世界中&#xff0c;組織越來越依賴于實時數據來做出決策。數據可視化是理解和分析這些數據的關鍵工具&#xff0c;它幫助用戶將復雜的數據集轉換成直觀的圖表和儀表板&#xff0c;從而更容易識別趨勢、模式和異常。Grafana&#xff0c;作為一個功能強大的…

架構師面試(三十六):廣播消息

題目 在像 IM、短視頻、游戲等實時在線類的業務系統中&#xff0c;一般會有【廣播消息】業務&#xff0c;這類業務具有瞬時高流量的特點。 在對【廣播消息】業務實現時通常需要同時寫 “系統消息庫” 和更新用戶的 “聯系人庫” 的操作&#xff0c;用戶的聯系人表中會有未讀數…

大模型微調 - transformer架構

什么是Transformer Transformer 架構是由 Vaswani 等人在 2017 年提出的一種深度學習模型架構&#xff0c;首次發表于論文《Attention is All You Need》中 Transformer 的結構 Transformer 編碼器&#xff08;Encoder&#xff09; 解碼器&#xff08;Decoder&#xff09; …

基于華為云 ModelArts 的在線服務應用開發(Requests 模塊)

基于華為云 ModelArts 的在線服務應用開發&#xff08;Requests 模塊&#xff09; 一、本節目標 了解并掌握 Requests 模塊的特點與用法學會通過 PythonRequests 訪問華為云 ModelArts 在線推理服務熟悉 JSON 模塊在 Python 中的數據序列化與反序列化掌握 Python 文件 I/O 的基…

python pymysql如何保證數據庫更新成功

python pymysql如何保證數據庫更新成功 在使用Python的PyMySQL庫與MySQL數據庫交互時,確保數據庫更新操作成功執行,可以通過以下幾種方式: 使用execute()和commit() 當執行一個更新(UPDATE)、插入(INSERT)或刪除(DELETE)操作時,你需要調用execute()方法來執行SQL語句…

【數據可視化-30】Netflix電影和電視節目數據集可視化分析

&#x1f9d1; 博主簡介&#xff1a;曾任某智慧城市類企業算法總監&#xff0c;目前在美國市場的物流公司從事高級算法工程師一職&#xff0c;深耕人工智能領域&#xff0c;精通python數據挖掘、可視化、機器學習等&#xff0c;發表過AI相關的專利并多次在AI類比賽中獲獎。CSDN…

【深度強化學習 DRL 快速實踐】逆向強化學習算法 (IRL)

Inverse Reinforcement Learning (IRL) 詳解 什么是 Inverse Reinforcement Learning&#xff1f; 在傳統的強化學習 (Reinforcement Learning, RL) 中&#xff0c;獎勵函數是已知的&#xff0c;智能體的任務是學習一個策略來最大化獎勵 而在逆向強化學習 (Inverse Reinforc…

入侵檢測系統(IDS)與入侵防御系統(IPS):功能對比與部署實踐

入侵檢測系統&#xff08;IDS&#xff09;與入侵防御系統&#xff08;IPS&#xff09;&#xff1a;功能對比與部署實踐 在網絡安全防御體系中&#xff0c;入侵檢測系統&#xff08;Intrusion Detection System, IDS&#xff09;與入侵防御系統&#xff08;Intrusion Preventio…

P12167 [藍橋杯 2025 省 C/Python A] 倒水

P12167 [藍橋杯 2025 省 C/Python A] 倒水 題目描述 小藍有 n n n 個裝了水的瓶子&#xff0c;從左到右擺放&#xff0c;第 i i i 個瓶子里裝有 a i a_i ai? 單位的水。為了美觀&#xff0c;小藍將水循環染成了 k k k 種顏色&#xff0c;也就是說&#xff0c;第 i i i …

短視頻矩陣系統可視化剪輯功能開發,支持OEM

在短視頻營銷與內容創作競爭日益激烈的當下&#xff0c;矩陣系統中的可視化剪輯功能成為提升內容產出效率與質量的關鍵模塊。它以直觀的操作界面和強大的編輯能力&#xff0c;幫助創作者快速將創意轉化為優質視頻。本文將結合實際開發經驗&#xff0c;從需求分析、技術選型到核…

制作一款打飛機游戲22:表格導出

編輯器功能擴展 今天&#xff0c;我想讓編輯器能夠處理一個數組&#xff0c;這是編輯器將要編輯的東西&#xff0c;它只編輯數組。這些區域在后續的不同版本的編輯器中會有不同的含義&#xff0c;但現在我想創建一個模板&#xff0c;能夠加載一個二維數組&#xff0c;并將二維…

AI數據分析的利器:解鎖BI工具的無限潛力

在數字化浪潮席卷全球的今天&#xff0c;數據已成為企業最寶貴的資產之一。如何高效、準確地分析這些數據&#xff0c;挖掘其中的價值&#xff0c;成為企業決策的關鍵。AI數據分析&#xff0c;作為新時代的數據分析利器&#xff0c;正逐漸改變著企業的決策方式。而BI&#xff0…

【每天一個知識點】IPv4(互聯網協議版本4)和IPv6(互聯網協議版本6)

IPv4&#xff08;互聯網協議版本4&#xff09;和IPv6&#xff08;互聯網協議版本6&#xff09;是用于在互聯網上標識和定位設備的兩種主要協議。它們的主要區別在于地址空間、結構、以及一些附加功能。以下是兩者的對比&#xff1a; 1. 地址長度 IPv4: 地址長度為32位&#xf…

numpy.random.normal與numpy.random.randn的區別與聯系

先說結論&#xff1a; numpy.random.normal 對應的是 正態分布&#xff0c;numpy.random.randn 對應的是標準正態分布&#xff0c;所以 numpy.random.randn 是 numpy.random.normal 的一個特例。 1. numpy.random.normal 從正態&#xff08;高斯&#xff09;分布中抽取隨機樣…

基于 EFISH-SBC-RK3588 的無人機智能巡檢終端方案?

一、硬件架構設計? ?核心算力平臺&#xff08;EFISH-SBC-RK3588&#xff09;? ?異構計算能力?&#xff1a;搭載 8 核 ARM 架構&#xff08;4Cortex-A762.4GHz 4Cortex-A551.8GHz&#xff09;&#xff0c;集成 6 TOPS NPU 與 Mali-G610 GPU&#xff0c;支持多傳感器數據并…

軟測面經(私)

測試流程 分析需求——>制定測試計劃——>設計測試用例——>執行測試——>編寫測試報告 黑盒測試 等價類劃分、邊界值分析法、猜錯法、隨機數法、因果圖。 白盒測試 代碼檢查法、程序變異、靜態結構分析法、靜態質量度量法、符號測試法、邏輯覆蓋法、域測試、…

那些年踩過的坑之Arrays.asList

一、前言 熟悉開發的兄弟都知道&#xff0c;在寫新增和刪除功能的時候&#xff0c;大多數時候會寫成批量的&#xff0c;原因也很簡單&#xff0c;批量既支持單個也支持多個對象的操作&#xff0c;事情也是發生在這個批量方法的調用上&#xff0c;下面我簡單說一下這個事情。 二…