哈希表2

xiaoxiao2021-02-28  20

哈希表的初始化

void HashInit(HashTable* ht, HashFunc func) { if(ht == NULL) { return; } ht -> size = 0; ht -> func = func; size_t i = 0; for(; i < MaxSize; i++) { ht -> data[i] = NULL; } }

哈希表的结点创建

HashElem* CreateHashElemNode(KeyType key, ValueType value) { HashElem* new_node = (HashElem*)malloc(sizeof(HashElem)); new_node -> key = key; new_node -> value = value; new_node -> next = NULL; return new_node; } void DestroyHashElemNode(HashElem* node) { if(node == NULL) { return; } free(node); }

哈希表的销毁

void HashDestroy(HashTable* ht) { if(ht == NULL) { return; } ht -> size = 0; ht -> func = NULL; size_t i = 0; for(; i < MaxSize; i++) { HashElem* cur = ht -> data[i]; while(cur != NULL) { HashElem* next = cur -> next; DestroyHashElemNode(cur); cur = next; } } }

哈希表的查找

int HashBucketFind(HashElem* node, KeyType key) { if(node == NULL) { return 0; } HashElem* cur = node; while(cur != NULL) { if(cur -> key == key) { return 1; } cur = cur -> next; } return 0; } int HashFind(HashTable* ht, KeyType key, ValueType* value) { if(ht == NULL || value == NULL) { return 0; } size_t offset = ht -> func(key); HashElem* cur = ht -> data[offset]; while(cur != NULL) { if(cur -> key == key) { *value = cur -> value; return 1; } cur = cur -> next; } return 0; } int HashBucketFindEx(HashElem* node, KeyType key, HashElem** cur_node, HashElem** prev_node) { if(node == NULL) { return 0; } if(cur_node == NULL || prev_node == NULL) { return 0; } HashElem* cur = node; HashElem* prev = NULL; while(cur != NULL) { prev = cur; if(cur -> key == key) { break; } cur = cur -> next; } if(cur == NULL) { return 0; } *cur_node = cur; *prev_node = prev; return 1; }

哈希表的插入

void HashInsert(HashTable* ht, KeyType key, ValueType value) { if(ht == NULL) { return; } size_t offset = ht -> func(key); HashElem* new_node = CreateHashElemNode(key, value); int ret = HashBucketFind(ht -> data[offset], key); if(ret == 1) { return; } new_node -> next = ht -> data[offset]; ht -> data[offset] = new_node; ht -> size++; }

哈希表的删除

void HashRemove(HashTable* ht, KeyType key) { if(ht == NULL) { return; } if(ht -> size == 0) { return; } size_t offset = ht -> func(key); HashElem* cur = NULL; HashElem* prev = NULL; int ret = HashBucketFindEx(ht -> data[offset], key, &cur, &prev); if(ret == 0) { return;//没有找到 } if(prev == NULL) { ht -> data[offset] = cur -> next; } else { prev -> next = cur -> next; } DestroyHashElemNode(cur); cur = NULL; ht -> size--; }
转载请注明原文地址: https://www.6miu.com/read-1700109.html

最新回复(0)