1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #define ERROR 0
  5. #define OK 1
  6. #define Size 21 // 指定质数(数组长度)
  7. typedef struct{
  8. char name[];
  9. char address[];
  10. char num[];
  11. }mul;
  12. typedef struct{
  13. mul data[];
  14. int size;
  15. }Hashtable;
  16. void init(Hashtable &h)
  17. {
  18. for(int i=;i<Size;i++){
  19. h.data[i].num[]=;//首位赋为0
  20. }
  21. h.size = Size;
  22. }
  23. // 判断电话簿是否为空
  24. int kong(Hashtable &h){
  25. for(int i=;i<Size;i++){
  26. if(h.data[i].num[]!=){
  27. return ERROR;
  28. }
  29. }
  30. return OK;
  31. }
  32. int HashSearch(Hashtable &h);
  33.  
  34. // 新存入的数的和是否已经被存储了
  35. int c_t(Hashtable &h,int sum){
  36. int m,n,sum1=;
  37. for(int k=;k<Size;k++){ //循环整个数组
  38. n = strlen(h.data[k].num);
  39. if(h.data[k].num[]!=){
  40. for(m=;m<n;m++){
  41. sum1=sum1+h.data[k].num[m]-'';
  42. }
  43. if(sum1==sum){
  44. printf("您输入的电话号码已经被存储,请重新输入\n\n");
  45. HashSearch(h);
  46. fflush(stdin);
  47. return ERROR;
  48. }
  49. }
  50. }
  51. return OK;
  52. }
  53. // 寻址存数
  54. int HashSearch(Hashtable &h)
  55. {
  56. char nu[],na[],add[];
  57. int i,p,j,y=,boo=;//nu关键字
  58. int m,n,sum=,sum1=;
  59. printf("请输入要存入的电话记录的姓名、地址和11位手机号码(用空格隔开)\n");
  60. scanf("%s",na);
  61. scanf("%s",add);
  62. scanf("%s",nu);
  63. n=strlen(nu); // 电话号的长度
  64. if(n==){
  65. for(m=;m<n;m++){
  66. sum=sum+nu[m]-''; // 计算电话号码的总和进行存储
  67. }
  68. boo=c_t(h,sum); // 判断输入的数是否被存储了
  69. if(boo){
  70. j=sum%Size;//哈希函数
  71. if(h.data[j].num[]==){
  72. p=j;
  73. h.size=j;
  74. }else{
  75. i=(j+)%Size; // 向后探测一个位置
  76. if(h.data[i].num[]==){
  77. p=i;
  78. h.size=i;
  79. }
  80. while(h.data[i].num[]!= && i!=j) {
  81. i=(i+)%Size; //向后探测位置
  82. if(h.data[i].num[]==){
  83. p=i;
  84. h.size=i;
  85. break;
  86. }
  87. }
  88. if (i==j){
  89. printf("当前电话谱最多只能实现 %d 个数据存储\n",Size);
  90. return ERROR;
  91. }
  92. }
  93. strcpy(h.data[p].num,nu); // 把存入的数据放入定义的数组指定位置
  94. strcpy(h.data[p].address,add);
  95. strcpy(h.data[p].name,na);
  96. printf("存入数据 %d 号位置: %s %s %s\n",h.size,h.data[p].name,h.data[p].address,h.data[p].num);
  97. }
  98. }else{
  99. printf("\n!!!请输入11位手机号码!!!\n");
  100. HashSearch(h);
  101. }
  102. return OK;
  103. }
  104. // 批量存入电话记录
  105. int pl_HashSearch(Hashtable &h){
  106. int n=;
  107. printf("请输入您要添加电话记录的条数:");
  108. scanf("%d",&n);
  109. if(<n&&n<){
  110. for(int i=;i<n;i++){
  111. HashSearch(h);
  112. }
  113. }else{
  114. printf("\n您存入的条数大于20条 或者小于2条\n\n");
  115. pl_HashSearch(h);
  116. }
  117. return OK;
  118. }
  119. // 打印所有记录
  120. void disp(Hashtable &h)
  121. {
  122. printf("电话簿中电话记录如下:\n");
  123. for(int i=;i<Size;++i){
  124. if(h.data[i].num[]){
  125. printf("%d号位置\n姓名:%s 地址:%s 电话:%s\n",i,h.data[i].name,h.data[i].address,h.data[i].num);
  126. }
  127. }
  128. }
  129. // 哈希查找
  130. int hash_kind(Hashtable h){
  131. char num[];
  132. int i,j,y=;//nu关键字
  133. int m,n,sum=;
  134. printf("请输入您要在电话簿中查找的电话号码:\n");
  135. scanf("%s",&num);
  136. n=strlen(num); // 电话号的长度
  137. for(m=;m<n;m++){
  138. sum=sum+num[m]-''; // 计算电话号码的总和进行存储
  139. }
  140. j=sum%Size;//哈希函数
  141. if(strcmp(h.data[j].num,num)==){ // 探测查找
  142. printf("您要查找的相关信息:%d号位置: \n姓名:%s\n地址:%s\n电话号码:%s\n",j,h.data[j].name,h.data[j].address,h.data[j].num);
  143. }
  144. else{
  145. i=(j+)%Size;
  146. while(h.data[i].num[]!= && i!=j) {
  147. if(strcmp(h.data[i].num,num)==){
  148. printf("您要查找的相关信息:%d号位置 : \n姓名:%s\n地址:%s\n电话号码:%s\n",i,h.data[j].name,h.data[j].address,h.data[j].num);
  149. break;
  150. }
  151. i=(i+)%Size; //向后探测一个位置
  152. }
  153. if(h.data[i].num[]==){
  154. printf("\n(嘟。。)当前号码谱没有此号码!!查无此人!!查无此人!!\n");
  155. return ERROR;
  156. }
  157.  
  158. }
  159. return OK;
  160. }
  161. //操作菜单
  162. void OperateMenu(){
  163.  
  164. printf("\n\n--------------请选择元素处理方式---------\n\n");
  165. printf("注:电话号应为 11 位\n\n");
  166. printf("0> :退出\n\n");
  167. printf("1>: 存入电话号\n\n");
  168. printf("2>: 批量存入电话号\n\n");
  169. printf("3>: 哈希查找电话号\n\n");
  170. printf("4>: 显示电话簿\n\n");
  171. printf("请选择对元素的处理:");
  172. }
  173. void main(){
  174. int w=,k,boo=,i=,e=;
  175. Hashtable h;
  176. printf("注:此测试过程输入值应全为数字\n\n");
  177. printf("进入号码簿存储请输入:'1'\n\n");
  178. printf("退出请选择'0'或 其它!!\n\n");
  179. printf("请选择:");
  180. scanf("%d",&w);
  181. if(w==){
  182. init(h);
  183. OperateMenu();
  184. scanf("%d",&k);
  185. while(k){
  186. switch(k){
  187. case :break;
  188. case :boo=HashSearch(h);
  189. if(boo)
  190. printf("存入成功!!\n");
  191. else
  192. printf("存入失败!!\n");
  193. break;
  194. case :boo=pl_HashSearch(h);
  195. if(boo)
  196. printf("批量存入成功!!\n");
  197. else
  198. printf("批量存入失败!!\n");
  199. break;
  200. case :boo=kong(h);
  201. if(boo==){
  202. printf("\n!!当前电话簿为空!!\n");
  203. }else{
  204. boo=hash_kind(h);
  205. if(boo)
  206. printf("哈希查找成功!!\n");
  207. else
  208. printf("哈希查找失败!!\n");
  209. }
  210. break;
  211.  
  212. case :
  213. boo=kong(h);
  214. if(boo==){
  215. printf("\n!!当前电话簿为空!!\n");
  216. }else{disp(h); }break;
  217. }
  218. OperateMenu();
  219. scanf("%d",&k);
  220. }
  221. }
  222. }

c_数据结构_哈希表的更多相关文章

  1. 数据结构 5 哈希表/HashMap 、自动扩容、多线程会出现的问题

    上一节,我们已经介绍了最重要的B树以及B+树,使用的情况以及区别的内容.当然,本节课,我们将学习重要的一个数据结构.哈希表 哈希表 哈希也常被称作是散列表,为什么要这么称呼呢,散列.散列.其元素分布较 ...

  2. 数据结构是哈希表(hashTable)

    哈希表也称为散列表,是根据关键字值(key value)而直接进行访问的数据结构.也就是说,它通过把关键字值映射到一个位置来访问记录,以加快查找的速度.这个映射函数称为哈希函数(也称为散列函数),映射 ...

  3. python数据结构之哈希表

    哈希表(Hash table) 众所周知,HashMap是一个用于存储Key-Value键值对的集合,每一个键值对也叫做Entry.这些个键值对(Entry)分散存储在一个数组当中,这个数组就是Has ...

  4. 算法与数据结构基础 - 哈希表(Hash Table)

    Hash Table基础 哈希表(Hash Table)是常用的数据结构,其运用哈希函数(hash function)实现映射,内部使用开放定址.拉链法等方式解决哈希冲突,使得读写时间复杂度平均为O( ...

  5. 数据结构HashMap哈希表原理分析

    先看看定义:“散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构.也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度. 哈希 ...

  6. 数据结构,哈希表hash设计实验

    数据结构实验,hash表 采用链地址法处理hash冲突 代码全部自己写,转载请留本文连接, 附上代码 #include<stdlib.h> #include<stdio.h> ...

  7. js:数据结构笔记7--哈希表

    哈希表(散列表):通过哈希函数将键值映射为一个字典; 哈希函数:依赖键值的数据类型来构建一个哈希函数: 一个基本的哈希表:(按字符串计算键值) function HashTable() { this. ...

  8. C++数据结构之哈希表

    哈希表的定义:哈希表是一种根据关键码去寻找值的数据映射结构,该结构通过把关键码映射的位置去寻找存放值的地方.键可以对应多个值(即哈希冲突),值根据相应的hash公式存入对应的键中. 哈希函数的构造要求 ...

  9. JAVA数据结构之哈希表

    Hash表简介: Hash表是基于数组的,优点是提供快速的插入和查找的操作,编程实现相对容易,缺点是一旦创建就不好扩展,当hash表被基本填满的时候,性能下降非常严重(发生聚集引起的性能的下降),而且 ...

随机推荐

  1. web项目中实现页面跳转的两种方式

    <a href="javascript:"></a>跳转在网页本身,URL不改变 <a href="#"></a> ...

  2. js 点击获取验证码后的倒数60s

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> <script ...

  3. 怎样在Cocos2d-x中使用Lua脚本

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/u013321328/article/details/25699545 笔者使用的是Cocos2d-x ...

  4. 如果通过cookies和localStorage取值?

    1. getCook : 设定setCookie值 let setCookie = setCookie('wan',data,7); function setCookie(c_name,value,e ...

  5. Linux特殊位SUID、SGID、SBIT

    Linux特殊位SUID.SGID.SBIT 前言 Linux中的文件权限一般有x.w.r,在某个情况下有需要用到s.t,即特殊位. 进程运行时能够访问哪些资源或文件,不取决于进程文件的属主属组,而是 ...

  6. AutoFac mvc和WebAPI 注册Service (接口和实现)

    AutoFac  mvc和WebAPI  注册Service (接口和实现) 1.准备组件版本:Autofac 3.5.0    Autofac.Integration.Mvc 3.3.0.0  (I ...

  7. eclipse打包jar及第三方jar包一起导出(生成SDK)

    一.前言: 因公司需求,需要将某个工具类供外部使用,所以需要生成jar文件.但是jar内还包含了第三方的jar,普通的打包方式无法将lib下的第三方jar包提取. 这将会导致工具jar无法运行,或Ex ...

  8. libevent使用IOCP网络模型的示例

    这段时间抽空学习了一下强大的网络库libevent,其使用标准C语言编写,支持Windows.Linux.Mac等等主流操作系统,早期版本不支持Windows的IOCP,最新版本已经添加上了,在网上找 ...

  9. 笔记53 Mybatis快速入门(四)

    动态SQL 1.if 假设需要对Product执行两条sql语句,一个是查询所有,一个是根据名称模糊查询.那么按照现在的方式,必须提供两条sql语句:listProduct和listProductBy ...

  10. easyui datagrid 绑定从后台得到的复杂的特殊数据结构

    由于项目需要,从后台得到的数据统一为了类似{state:xxx,data:xxx,message:xxx}类型 但是easyui datagrid却只认{total:xxx,rows:xxx}...所 ...