当前位置:   article > 正文

哈希表的建立和查找_设计一个哈希表,使平均查找长度不超过2,完成相应的建表和查表程序。* 待填入

设计一个哈希表,使平均查找长度不超过2,完成相应的建表和查表程序。* 待填入
  1. /* 针对某个集体(比如所在班级)中的人名设计一个哈希表,使的平均查找的长度不超过2完成相应的建表和查表的程序
  2. 题目要求:
  3.        假设人名为姓名的汉语拼音形式,待填入哈希表的人名工有30个,取平均查找长度的上限
  4.     为2。哈希函数用除留余数法构造,用伪随机探测再散列法处理冲突。
  5.    测试数据
  6.        自定义。
  7. */
  8. #include<stdio.h>
  9. #include<conio.h>
  10. #define HASH_LEN 50 //哈希表的长度
  11. #define M 47 //随机数
  12. #define NAME_NO 30 //人名的个数
  13. typedef struct
  14. {
  15. char *py; //名字的拼音
  16. int k; //拼音所对应的整数
  17. }NAME;
  18. NAME NameList[HASH_LEN]; //全局变量NAME
  19. typedef struct //哈希表
  20. {
  21. char *py; //名字的拼音
  22. int k; //拼音所对应的整数
  23. int si; //查找长度
  24. }HASH;
  25. HASH HashList[HASH_LEN]; //全局变量HASH
  26. void InitNameList() //姓名(结构体数组)初始化
  27. {
  28. char *f;
  29. int r,s0,i;
  30. NameList[0].py="wanghui";
  31. NameList[1].py="mayuelong";
  32. NameList[2].py="chenzhicheng";
  33. NameList[3].py="sunpeng";
  34. NameList[4].py="zengqinghui";
  35. NameList[5].py="liqingbo";
  36. NameList[6].py="liujunpeng";
  37. NameList[7].py="jiangquanlei";
  38. NameList[8].py="xingzhengchuan";
  39. NameList[9].py="luzhaoqian";
  40. NameList[10].py="gaowenhu";
  41. NameList[11].py="zhuhaoyin";
  42. NameList[12].py="chenlili";
  43. NameList[13].py="wuyunyun";
  44. NameList[14].py="huangjuanxia";
  45. NameList[15].py="wangyan";
  46. NameList[16].py="zhoutao";
  47. NameList[17].py="jiangzhenyu";
  48. NameList[18].py="liuxiaolong";
  49. NameList[19].py="wangziming";
  50. NameList[20].py="fengjunbo";
  51. NameList[21].py="lilei";
  52. NameList[22].py="wangjia";
  53. NameList[23].py="zhangjianguo";
  54. NameList[24].py="zhuqingqing";
  55. NameList[25].py="huangmin";
  56. NameList[26].py="haoyuhan";
  57. NameList[27].py="zhoutao";
  58. NameList[28].py="zhujiang";
  59. NameList[29].py="lixiaojun";
  60. for (i=0;i<NAME_NO;i++)
  61. {
  62. s0=0;
  63. f=NameList[i].py;
  64. for (r=0;*(f+r)!='\0';r++)
  65. /* 方法:将字符串的各个字符所对应的ASCII码相加,所得的整数做为哈希表的关键字*/
  66. s0=*(f+r)+s0;
  67. NameList[i].k=s0;
  68. } }
  69. void CreateHashList() //建立哈希表
  70. {int i;
  71. for (i=0; i<HASH_LEN;i++)
  72. {
  73. HashList[i].py="";
  74. HashList[i].k=0;
  75. HashList[i].si=0;
  76. }
  77. for (i=0;i<HASH_LEN;i++)
  78. {
  79. int sum=0;
  80. int adr=(NameList[i].k)%M; //哈希函数
  81. int d=adr;
  82. if(HashList[adr].si==0) //如果不冲突
  83. {
  84. HashList[adr].k=NameList[i].k;
  85. HashList[adr].py=NameList[i].py;
  86. HashList[adr].si=1;
  87. }
  88. else //冲突
  89. {
  90. do
  91. {
  92. d=(d+NameList[i].k%10+1)%M; //伪随机探测再散列法处理冲突
  93. sum=sum+1; //查找次数加1
  94. }while (HashList[d].k!=0);
  95. HashList[d].k=NameList[i].k;
  96. HashList[d].py=NameList[i].py;
  97. HashList[d].si=sum+1;
  98. }}}
  99. void FindList() //查找
  100. {
  101. char name[20]={0};
  102. int s0=0,r,sum=1,adr,d;
  103. printf("\n请输入姓名的拼音:");
  104. scanf("%s",name);
  105. for (r=0;r<20;r++) //求出姓名的拼音所对应的整数(关键字)
  106. s0+=name[r];
  107. adr=s0%M; //使用哈希函数
  108. d=adr;
  109. if(HashList[adr].k==s0) //分3种情况进行判断
  110. printf("\n姓名:%s 关键字:%d 查找长度为: 1",HashList[d].py,s0);
  111. else if (HashList[adr].k==0)
  112. printf("无此记录!");
  113. else
  114. {
  115. int g=0;
  116. do
  117. {
  118. d=(d+s0%10+1)%M; //伪随机探测再散列法处理冲突
  119. sum=sum+1;
  120. if (HashList[d].k==0)
  121. {
  122. printf("无此记录! ");
  123. g=1;
  124. }
  125. if (HashList[d].k==s0)
  126. {
  127. printf("\n姓名:%s 关键字:%d 查找长度为:%d",HashList[d].py,s0,sum);
  128. g=1;
  129. }
  130. }while(g==0);
  131. } }
  132. void Display() // 显示哈希表
  133. {int i;
  134. float average=0;
  135. printf("\n\n地址\t关键字\t\t搜索长度\tH(key)\t 姓名\n"); //显示的格式
  136. for(i=0; i<50; i++)
  137. {
  138. printf("%d ",i);
  139. printf("\t%d ",HashList[i].k);
  140. printf("\t\t%d ",HashList[i].si);
  141. printf("\t\t%d ",HashList[i].k%M);
  142. printf("\t %s ",HashList[i].py);
  143. printf("\n");
  144. }
  145. for (i=0;i<HASH_LEN;i++)
  146. average+=HashList[i].si;
  147. average/=NAME_NO;
  148. printf("\n\n平均查找长度:ASL(%d)=%f \n\n",NAME_NO,average);
  149. }
  150. void main()
  151. {
  152. char ch1;
  153. printf("\n 哈希表的建立和查找\n");
  154. printf(" *-------------------------------------------*\n");
  155. printf(" | D. 显示哈希表 |\n");
  156. printf(" | F. 查找 |\n");
  157. printf(" | Q. 退出 |\n");
  158. printf(" *-------------------------------------------*\n");
  159. InitNameList();
  160. CreateHashList ();
  161. while(1)
  162. {
  163. printf("\n Option-:");
  164. fflush(stdin);
  165. ch1=getchar();
  166. if (ch1=='D'||ch1=='d')
  167. Display();
  168. else if (ch1=='F'||ch1=='f')
  169. FindList();
  170. else if (ch1=='Q'||ch1=='q')
  171. return;
  172. else
  173. {
  174. printf("\n请输入正确的选择!");
  175. }}}

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

闽ICP备14008679号