C語言實現的哈希表
阿新 • • 發佈:2018-09-26
print const 插入 fin pre com ofo code http C語言實現的哈希表
哈希表可以簡單理解為多個鏈表的集合,將每個新的成員根據其哈希值進行分類,這樣可以加快鏈表的查找速度
參考:https://www.cnblogs.com/s-b-b/p/6208565.html
哈希表可以簡單理解為多個鏈表的集合,將每個新的成員根據其哈希值進行分類,這樣可以加快鏈表的查找速度
參考:https://www.cnblogs.com/s-b-b/p/6208565.html
#include <stdio.h> #include <stdlib.h> #include <string.h> #define HASHSIZE 10 typedef unsigned int uint; /*定義一個鏈表的節點*/ typedef struct Node{ char key[17]; char value[4]; struct Node *next; }Node; /*定義一組鏈表*/ Node *node[HASHSIZE]; /*初始化:為鏈表頭開辟空間*/ int init(Node *node) { node = (Node *)malloc(sizeof(Node)); if(NULL == node) return 1; bzero(node, sizeof(Node)); return 0; } /*計算哈希值*/ uint hash(const char *key){ uint hash = 0; for(; *key; ++key) { hash = hash*33+*key; } return hash%HASHSIZE; } /*查找:根據哈希值得出index, 然後到對應的鏈表中查找*/ Node *lookup(const char *key) { Node *np; uint index; index = hash(key); for(np = node[index];np;np = np->next){ if(!strcmp(key, np->key)) return np; } return NULL; } /*插入:先查找該值是否存在,然後計算哈希值,插入對應的鏈表*/ uint install(const char *key, const char *value) { uint index; Node *np; if(!(np = lookup(key))){ index = hash(key); np = (Node*)malloc(sizeof(Node)); if(!np) return 1; strcpy(np->key, key); strcpy(np->value, value); np->next = node[index]; node[index] = np; } return 0; } /*例:*/ int main(void) { /*為哈希表插入一組數據*/ char key[17] = "10.10.16.31"; char value[4] = "001"; install(key, value); char key1[17] = "10.10.16.32"; char value1[4] = "002"; install(key1, value1); char key2[17] = "10.10.16.33"; char value2[4] = "003"; install(key2, value2); char key3[17] = "10.10.16.34"; char value3[4] = "004"; install(key3, value3); char key4[17] = "10.10.16.41"; char value4[4] = "005"; install(key4, value4); Node *np; /*哈希表初始化:如果不為表頭賦值的話可以省略*/ int i,j; for(i=0;i<HASHSIZE;i++){ init(node[i]); } /*遍歷哈希表*/ for(i=0; i<HASHSIZE; i++) { if(node[i]){ printf("i:%d, key:%s, value:%s\n", i, node[i]->key, node[i]->value); np = node[i]->next; while(np){ printf("key:%s, value:%s\n", np->key, np->value); np = np->next; } } } return 0; }
C語言實現的哈希表