当前位置:   article > 正文

数据结构实验报告8--哈希表的建立与查找_哈希表 数据结构实验报告

哈希表 数据结构实验报告

实验内容及要求:

编写控制台应用程序,提供以下菜单项:

  1. 插入关键字
  2. 删除关键字
  3. 查找关键字
  4. 结束程序

其中,“插入关键字”是指从键盘输入一个关键字,将关键字插入哈希表中,若插入的关键字已存储于哈希表中,则插入失败,显示提示信息;若插入关键字数目已超过哈希表设计容量,则插入失败,显示提示信息;其它情况则插入成功,显示提示信息。程序初始运行时,哈希表为空,通过插入多个关键字建立哈希表。

“删除关键字”是指从键盘输入一个关键字,若在哈希表中查找成功,则将关键字从哈希表中删除;若查找失败,显示提示信息。

“查找关键字”是指从键盘输入一个关键字,在哈希表中查找,显示查找成功与失败的提示信息。

已知哈希函数H(K)=K mod m,其中m为哈希表长度(程序中m应不小于10)。可选择用二次探测再散列或链地址法解决冲突。若选用二次探测再散列,装填因子设为0.8;若选用链地址法,要求哈希表允许的关键字最大数目为2m。

提示:选用二次探测再散列时,空闲元素位置应存入“哑元素”占位,以标识元素位置空闲。

实验目的:掌握哈希表的建立与查找。

参考博客:(4条消息) 西南交通大学数据结构第八次实验--哈希表的建立与查找_Jellyfish Knight的博客-CSDN博客 

  1. #define _CRT_SECURE_NO_WARNINGS 1
  2. #include<iostream>
  3. using namespace std;
  4. struct Node {
  5. int data = -1;
  6. bool flag = false;
  7. Node* next = nullptr;
  8. };
  9. class Menu {
  10. private:
  11. Node* hash_map;
  12. int max_length;//哈希表总长度
  13. int cur_length;//哈希表当前长度
  14. int HashFunction(int key) const;
  15. static void ShowMenu();
  16. void Insert();
  17. void Delete();
  18. void Inquire();
  19. public:
  20. Menu(int length);
  21. void Test();
  22. ~Menu() {
  23. delete hash_map;
  24. }
  25. };
  26. Menu::Menu(int length) {
  27. while (length < 10) {
  28. cout << "哈希表长度需要不小于10!请重新输入!" << endl;
  29. cin >> length;
  30. }
  31. max_length = length;
  32. hash_map = new Node[length];
  33. cur_length = 0;
  34. }
  35. //哈希函数
  36. int Menu::HashFunction(int key) const {
  37. return key % max_length;
  38. }
  39. //菜单展示
  40. void Menu::ShowMenu() {
  41. cout << "============================================" << endl;
  42. cout << "1. 插入关键字: " << endl;
  43. cout << "2. 删除关键字: " << endl;
  44. cout << "3. 查找关键字: " << endl;
  45. cout << "4. 结束程序: " << endl;
  46. cout << "5. 清屏: " << endl;
  47. cout << "============================================" << endl;
  48. }
  49. //插入关键字
  50. void Menu::Insert() {
  51. int key;
  52. cout << "请输入要插入的关键字: ";
  53. cin >> key;
  54. int position = HashFunction(key);//通过哈希函数计算位置
  55. auto p = &hash_map[position];
  56. if (cur_length + 1 > 2 * max_length) {
  57. cout << "当前长度已超过允许长度!!!" << endl;
  58. cout << "插入失败!!!" << endl;
  59. return;
  60. }
  61. //先判断关键字是否存在
  62. if (p->flag) {
  63. if (p->data == key) {
  64. cout << "插入失败!!!当前关键字已存在!!!" << endl;
  65. return;
  66. }
  67. else {
  68. //解决冲突
  69. while (p) {
  70. if (p->data == key) {
  71. cout << "插入失败!!!当前关键字已存在!!!" << endl;
  72. return;
  73. }
  74. else {
  75. if (p->next) {
  76. p = p->next;
  77. }
  78. else {
  79. auto new_node = new Node;
  80. new_node->data = key;
  81. new_node->flag = true;
  82. p->next = new_node;
  83. cur_length++;
  84. break;
  85. }
  86. }
  87. }
  88. }
  89. }
  90. //不存在则直接插入
  91. else {
  92. hash_map[position].data = key;
  93. hash_map[position].flag = true;
  94. cur_length++;
  95. }
  96. cout << "插入关键字: " << key << " 成功!!!" << endl;
  97. }
  98. void Menu::Delete() {
  99. int key;
  100. cout << "请输入需要删除的关键字: ";
  101. cin >> key;
  102. int position = HashFunction(key);
  103. auto p1 = &hash_map[position];
  104. auto p2 = &hash_map[position];
  105. bool flag = false;//只要找到待删除的关键字,则令flag为1
  106. while (p1 && p1->flag) {
  107. //删除不是解决冲突后的元素
  108. if (p1->data == key) {
  109. if (p1 == p2) {
  110. //如果p1指针指向不为空,则让当前哈希表中的值为p1指针所指向的值
  111. if (p1->next) {
  112. hash_map[position] = *p1->next;
  113. flag = true;
  114. break;
  115. }
  116. //如果p1指针指向NULL,则直接删除当前的值
  117. else {
  118. p1->flag = false;
  119. p1->data = -1;
  120. flag = true;
  121. break;
  122. }
  123. }
  124. else {
  125. if (p1->next) {
  126. p2->next = p1->next;
  127. p1->next = nullptr;
  128. flag = true;
  129. delete p1;
  130. break;
  131. }
  132. else {
  133. p2->next = nullptr;
  134. flag = true;
  135. delete p1;
  136. break;
  137. }
  138. }
  139. }
  140. //删除的是解决冲突后的元素
  141. else {
  142. p1 = p1->next;
  143. p2 = p1;
  144. }
  145. }
  146. if (!flag) {
  147. cout << "删除关键字 " << key << " 失败!!!因为它不存在!!!" << endl;
  148. }
  149. else {
  150. cur_length--;
  151. cout << "删除成功!!!" << endl;
  152. }
  153. }
  154. void Menu::Inquire() {
  155. int key;
  156. cout << "请输入要查询的关键字: " << endl;
  157. cin >> key;
  158. int position = HashFunction(key);
  159. auto p1 = &hash_map[position];
  160. int flag = false;
  161. while (p1 && p1->flag ) {
  162. if (p1->data == key) {
  163. flag = true;
  164. break;
  165. }
  166. else {
  167. p1 = p1->next;
  168. }
  169. }
  170. if (flag) {
  171. cout << "查询成功!!!" << endl;
  172. cout << "关键字" << key << " 在哈希表中!" << endl;
  173. }
  174. else {
  175. cout << "查询失败!" << endl;
  176. cout << "关键字" << key << " 不在哈希表中!" << endl;
  177. }
  178. }
  179. void Menu::Test() {
  180. int choice;
  181. ShowMenu();
  182. while (true) {
  183. cin >> choice;
  184. switch (choice) {
  185. case 1:
  186. Insert();
  187. break;
  188. case 2:
  189. Delete();
  190. break;
  191. case 3:
  192. Inquire();
  193. break;
  194. case 4:
  195. cout << "退出成功!!!" << endl;
  196. exit(0);
  197. case 5: {
  198. system("cls");
  199. ShowMenu();
  200. break;
  201. }
  202. default:
  203. break;
  204. }
  205. }
  206. }
  207. int main() {
  208. int m;
  209. cout << "请输入哈希表的长度m: " << endl;
  210. cin >> m;
  211. Menu menu(m);
  212. menu.Test();
  213. return 0;
  214. }

 

 

 

 

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/500053
推荐阅读
相关标签
  

闽ICP备14008679号