当前位置:   article > 正文

哈希表(散列表)——C++数据结构详解_哈希表数据结构代码c++

哈希表数据结构代码c++

目录

 1.哈希表原理精讲

​2.哈希链表算法实现

 2.1哈希表数据结构定义

 2.2哈希函数

2.3哈希链表初始化

2.4哈希链表查找函数

2.5哈希链表插入函数

2.6哈希链表删除元素

3.哈希表完整代码


哈希表 — 散列表,它是基于快速存取的角度设计的,也是一种典型的“空间换时间”的做法~

 假设:给24个人依次给予编号,从1到24

编号除6能整除的为第一组:        6     12     18     24

编号除6余数为1的为第二组:      1      7      13     19

编号除6余数为2的为第三组:      2      8      14     20

编号除6余数为3的为第四组:      3      9      15     21

编号除6余数为4的为第五组:      4     10     16     22

编号除6余数为5的为第六组:      5     11      17    23

  这样,当我们给出一个编号时,根据除6的余数,可以直接排除20个数据 ,从而更快速的找到他。

 1.哈希表原理精讲

键(key) : 组员的编号        如,1、5、19.....

值(value):组员的其他信息(包含  性别、年龄、薪水等)

索引: 数组的下标(0,1,2,3,4),用以快速定位和检索数据

哈希桶:  保存索引的数组(链表或数组),数组成员为每一个索引值相同的多个元素

哈希函数:将组员编号映射到索引上,采用除余法,如:组员编号19

2.哈希链表算法实现

 2.1哈希表数据结构定义

  1. #define DEFAULT_SIZE 16 //索引数组范围,或者说哈希桶的个数
  2. typedef struct _ListNode {
  3. int key; //键值
  4. void* data; //数据
  5. struct _ListNode* next;
  6. }ListNode;
  7. typedef ListNode* List;
  8. typedef ListNode* Element;
  9. typedef struct _HashTable {
  10. int TableSize; ///索引数组范围,或者说哈希桶的个数
  11. List* Thelists;
  12. }HashTable;

 2.2哈希函数

  1. //这里采用求余法做Hash函数
  2. int Hash(int key, int TableSize) {
  3. return(key % TableSize);
  4. }

2.3哈希链表初始化

  1. //哈希表初始化 TableSize决定哈希桶的数量或者说索引范围
  2. HashTable* InitHash(int TableSize) {
  3. int i = 0;
  4. HashTable* hTable = NULL;
  5. if (TableSize <= 0) {
  6. TableSize = DEFAULT_SIZE; //如果传入值小于0,就给予默认值
  7. }
  8. hTable = (HashTable*)malloc(sizeof(HashTable));
  9. if (NULL == hTable) {
  10. printf("HashTable malloc error\n");
  11. return NULL;
  12. }
  13. hTable->TableSize = TableSize;
  14. hTable->Thelists = NULL;
  15. //指针数组,指针的数组需要拿指针的指针接收
  16. hTable->Thelists = (List*)malloc(sizeof(List) * TableSize);
  17. if (NULL == hTable) {
  18. printf("HashTable malloc error\n");
  19. free(hTable);
  20. return NULL;
  21. }
  22. //为Hash桶对应的指针数组初始换链表节点
  23. for (int i = 0; i < TableSize; i++) {
  24. hTable->Thelists[i] = (ListNode*)malloc(sizeof(ListNode));
  25. if (NULL == hTable->Thelists[i]) {
  26. printf("HashTable malloc error\n");
  27. free(hTable->Thelists[i]);
  28. free(hTable);
  29. }
  30. else {
  31. //key赋值为0,值域(void*)和下一个指针赋为空
  32. memset(hTable->Thelists[i], 0, sizeof(ListNode));
  33. }
  34. }
  35. return hTable;
  36. }

2.4哈希链表查找函数

  1. Element findHash(HashTable** hashTable,const int key) {
  2. int index = 0;
  3. index = Hash(key, (*hashTable)->TableSize);
  4. List L = NULL; // L为对应哈希桶的指针
  5. L = (*hashTable)->Thelists[index];
  6. Element e = NULL;
  7. e = L->next; //e为对应值指针
  8. while (e!=NULL&&e->key!=key) {
  9. e = e->next;
  10. }
  11. return e;
  12. }

2.5哈希链表插入函数

  1. void insertHash(HashTable** hashTable, const int key, void* value) {
  2. Element insertElement = NULL;
  3. insertElement = findHash(hashTable, key);
  4. if (insertElement == NULL) {
  5. Element temp = NULL;
  6. temp=(Element)malloc(sizeof(ListNode));
  7. if (temp == NULL) {
  8. printf("malloc error\n");
  9. return;
  10. }
  11. temp->next = NULL;
  12. List L = (*hashTable)->Thelists[Hash(key, (*hashTable)->TableSize)];
  13. temp->data = value;
  14. temp->key = key;
  15. temp->next = L->next;
  16. L->next = temp;
  17. }
  18. else {
  19. printf("The key alerdy exist\n");
  20. }
  21. }

2.6哈希链表删除元素

  1. void deleteHash(HashTable* &hashtable, int key) {
  2. int index = Hash(key, hashtable->TableSize);
  3. List L = NULL;
  4. L = hashtable->Thelists[index];
  5. Element last = L;
  6. Element compareHash = NULL;
  7. compareHash = L->next;
  8. while (compareHash != NULL && compareHash->key != key) {
  9. last = compareHash;
  10. compareHash = compareHash->next;
  11. }
  12. if (compareHash != NULL) {
  13. last->next = compareHash->next;
  14. free(compareHash);
  15. }
  16. }

测试程序:

  1. int main() {
  2. char* a1 = (char*)"f张三";
  3. char* a2 = (char*)"李四";
  4. char* a3 = (char*)"王五";
  5. char* a4 = (char*)"赵六";
  6. char* arr[] = {a1,a2,a3,a4};
  7. HashTable* hashtable;
  8. hashtable = InitHash(17);
  9. insertHash(&hashtable, 1, arr[0]);
  10. insertHash(&hashtable, 2, arr[1]);
  11. insertHash(&hashtable, 3, arr[2]);
  12. insertHash(&hashtable, 4, arr[3]);
  13. deleteHash(hashtable, 1);
  14. for (int i = 0; i < 6; i++) {
  15. Element e = findHash(&hashtable, i);
  16. if (e) {
  17. printf("%s\n", (const char*)Retrieve(e));
  18. }
  19. else {
  20. printf("Not found [key:%d]\n", i);
  21. }
  22. }
  23. system("pause");
  24. return 0;
  25. }

运行结果:

程序图示:

3.哈希表完整代码

  1. #include<iostream>
  2. using namespace std;
  3. #define DEFAULT_SIZE 16 //索引数组范围,或者说哈希桶的个数
  4. typedef struct _ListNode {
  5. int key; //键值
  6. void* data; //数据
  7. struct _ListNode* next;
  8. }ListNode;
  9. typedef ListNode* List;
  10. typedef ListNode* Element;
  11. typedef struct _HashTable {
  12. int TableSize; ///索引数组范围,或者说哈希桶的个数
  13. List* Thelists;
  14. }HashTable;
  15. //这里采用求余法做Hash函数
  16. int Hash(int key, int TableSize) {
  17. return(key % TableSize);
  18. }
  19. //哈希表初始化 TableSize决定哈希桶的数量或者说索引范围
  20. HashTable* InitHash(int TableSize) {
  21. int i = 0;
  22. HashTable* hTable = NULL;
  23. if (TableSize <= 0) {
  24. TableSize = DEFAULT_SIZE; //如果传入值小于0,就给予默认值
  25. }
  26. hTable = (HashTable*)malloc(sizeof(HashTable));
  27. if (NULL == hTable) {
  28. printf("HashTable malloc error\n");
  29. return NULL;
  30. }
  31. hTable->TableSize = TableSize;
  32. hTable->Thelists = NULL;
  33. //指针数组,指针的数组需要拿指针的指针接收
  34. hTable->Thelists = (List*)malloc(sizeof(List) * TableSize);
  35. if (NULL == hTable) {
  36. printf("HashTable malloc error\n");
  37. free(hTable);
  38. return NULL;
  39. }
  40. //为Hash桶对应的指针数组初始换链表节点
  41. for (int i = 0; i < TableSize; i++) {
  42. hTable->Thelists[i] = (ListNode*)malloc(sizeof(ListNode));
  43. if (NULL == hTable->Thelists[i]) {
  44. printf("HashTable malloc error\n");
  45. free(hTable->Thelists[i]);
  46. free(hTable);
  47. }
  48. else {
  49. //key赋值为0,值域(void*)和下一个指针赋为空
  50. memset(hTable->Thelists[i], 0, sizeof(ListNode));
  51. }
  52. }
  53. return hTable;
  54. }
  55. Element findHash(HashTable** hashTable,const int key) {
  56. int index = 0;
  57. index = Hash(key, (*hashTable)->TableSize);
  58. List L = NULL; // L为对应哈希桶的指针
  59. L = (*hashTable)->Thelists[index];
  60. Element e = NULL;
  61. e = L->next; //e为对应值指针
  62. while (e!=NULL&&e->key!=key) {
  63. e = e->next;
  64. }
  65. return e;
  66. }
  67. void deleteHash(HashTable* &hashtable, int key) {
  68. int index = Hash(key, hashtable->TableSize);
  69. List L = NULL;
  70. L = hashtable->Thelists[index];
  71. Element last = L;
  72. Element compareHash = NULL;
  73. compareHash = L->next;
  74. while (compareHash != NULL && compareHash->key != key) {
  75. last = compareHash;
  76. compareHash = compareHash->next;
  77. }
  78. if (compareHash != NULL) {
  79. last->next = compareHash->next;
  80. free(compareHash);
  81. }
  82. }
  83. void insertHash(HashTable** hashTable, const int key, void* value) {
  84. Element insertElement = NULL;
  85. insertElement = findHash(hashTable, key);
  86. if (insertElement == NULL) {
  87. Element temp = NULL;
  88. temp=(Element)malloc(sizeof(ListNode));
  89. if (temp == NULL) {
  90. printf("malloc error\n");
  91. return;
  92. }
  93. temp->next = NULL;
  94. List L = (*hashTable)->Thelists[Hash(key, (*hashTable)->TableSize)];
  95. temp->data = value;
  96. temp->key = key;
  97. temp->next = L->next;
  98. L->next = temp;
  99. }
  100. else {
  101. printf("The key alerdy exist\n");
  102. }
  103. }
  104. void* Retrieve(Element e) {
  105. return e ? e->data : NULL;
  106. }
  107. int main() {
  108. char* a1 = (char*)"f张三";
  109. char* a2 = (char*)"李四";
  110. char* a3 = (char*)"王五";
  111. char* a4 = (char*)"赵六";
  112. char* arr[] = {a1,a2,a3,a4};
  113. HashTable* hashtable;
  114. hashtable = InitHash(17);
  115. insertHash(&hashtable, 1, arr[0]);
  116. insertHash(&hashtable, 2, arr[1]);
  117. insertHash(&hashtable, 3, arr[2]);
  118. insertHash(&hashtable, 4, arr[3]);
  119. deleteHash(hashtable, 1);
  120. for (int i = 0; i < 6; i++) {
  121. Element e = findHash(&hashtable, i);
  122. if (e) {
  123. printf("%s\n", (const char*)Retrieve(e));
  124. }
  125. else {
  126. printf("Not found [key:%d]\n", i);
  127. }
  128. }
  129. system("pause");
  130. return 0;
  131. }
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/578852
推荐阅读
相关标签
  

闽ICP备14008679号