哈希表添加哈希表(Hash Table,也叫散列表),是根据键(Key)而直接访问在内存存储位置的数据结构。typedef enum{ HASH_OK, -icoding
哈希表添加
哈希表(Hash Table,也叫散列表),是根據鍵(Key)而直接訪問在內存存儲位置的數據結構。也就是說,它通過計算一個關于鍵值的函數,將所需查詢的數據映射到表中一個位置來訪問記錄,這加快了查找速度。這個映射函數稱做哈希函數,存放記錄的數組稱做哈希表。哈希表相關定義如下:
typedef enum{HASH_OK,HASH_ERROR,HASH_ADDED,HASH_REPLACED_VALUE,HASH_ALREADY_ADDED,HASH_DELETED,HASH_NOT_FOUND, } HASH_RESULT;typedef struct __HashEntry HashEntry; struct __HashEntry{union{char *str_value;double dbl_value;int int_value;} key;union{char *str_value;double dbl_value;int int_value;long long_value;void *ptr_value;} value;HashEntry *next; };struct __HashTable{HashEntry **bucket; int size;HASH_RESULT last_error; }; typedef struct __HashTable HashTable;// 向哈希表中添加元素,其中鍵類型為char*, 元素類型為int。 HASH_RESULT hash_add_int(HashTable * table, const char * key, int value);
哈希表相關說明:
HASH_RESULT 類型為相關函數的返回類型
HashEntry 為哈希表所保存元素(即鍵值對 《key, value》)類型
HashTable 為哈希表,其中 bucket 指向大小為size的、元素類型為 HashEntry*的指針數組
哈希表采用鏈地址法處理沖突
請實現 hash_add_int 函數,向哈希表中添加元素,其中鍵類型為char*, 元素類型為int。
在添加過程中,如果要添加的鍵值key已在哈希表中,且對應的值value也已存在,則函數返回 HASH_ALREADY_ADDED;
如果要添加的鍵值key已在哈希表中,但對應的值value不同,函數將value值更新到哈希表中,之后返回 HASH_REPLACED_VALUE
如果要添加的鍵值key不在哈希表中,則函數創建 HashEntry 類型,并將其加入到哈希表中,且函數返回 HASH_ADDED。
本題所用的哈希函數如下:
//這一段看不懂就不管
#include <stdio.h> #include "stdlib.h" #include "hash.h" #include <string.h>HASH_RESULT hash_add_int(HashTable *table, const char *key, int value ){HashEntry *p;//指的是每一個鍵值對 int h = hash_string(key) % table->size;//保存哈希函數返回值 //int類型也可以 // !h %= table->size; 編譯器奇怪的不通過..... //該關鍵字對應的哈希表中鍵值對不存在, 分配節點存入 if(!table->bucket[h]){p = (HashEntry *)malloc(sizeof(HashEntry));if(!p) return HASH_ERROR;p->key.str_value = (char *)malloc(strlen(key));if(!p->key.str_value){free(p);return HASH_ERROR;}//!!!!字符串拷貝 strcpy(p->key.str_value, key);p->value.int_value = value;//最好還是置空 p->next = NULL;table->bucket[h] = p;return HASH_ADDED;}//關鍵字對應的哈希表中該位置存在鍵值對,判斷重復或者沖突 p = table->bucket[h];while(p){ //關鍵字相同 if(strcmp(key, p->key.str_value)==0){//判斷值 if(p->value.int_value == value){return HASH_ALREADY_ADDED;}else{p->value.int_value = value;return HASH_REPLACED_VALUE;}}//鏈地址法 else{if(p->next)p = p->next;elsebreak;}}//循環完成后 //p指向最后一個結點 HashEntry *q;//q接到p后面 q = (HashEntry *)malloc(sizeof(HashEntry));if(!q) return HASH_ERROR;q->key.str_value = (char *)malloc(strlen(key));if(!q->key.str_value){free(q);return HASH_ERROR;}strcpy(q->key.str_value, key);q->value.int_value = value;q->next = NULL;p->next = q;return HASH_ADDED;}?
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的哈希表添加哈希表(Hash Table,也叫散列表),是根据键(Key)而直接访问在内存存储位置的数据结构。typedef enum{ HASH_OK, -icoding的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: pembrolizumab中文名是什么
- 下一篇: 牙龈炎能自愈吗