IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    [原]实现哈希表

    yincheng01发表于 2015-05-27 04:36:56
    love 0
    
    1. #include
    2. #include
    3. #include
    4. using namespace std;
    5. #define HASH_LEN 50 //哈希表的长度
    6. #define M 47 //随机数
    7. int NAME_NO=34; //城市名的个数
    8. typedef struct
    9. {
    10. char *py; //名字的拼音
    11. int k; //拼音所对应的整数
    12. }NAME;
    13. NAME NameList[HASH_LEN]; //全局变量NAME
    14. typedef struct //哈希表
    15. {
    16. char *py; //名字的拼音
    17. int k; //拼音所对应的整数
    18. int si; //查找长度
    19. }HASH;
    20. HASH HashList[HASH_LEN]; //全局变量HASH
    21. void InitNameList() //姓名(结构体数组)初始化
    22. {
    23. char *f;
    24. int r,s0,i;
    25. NameList[0].py="harbin";
    26. NameList[1].py="shijiazhuang";
    27. NameList[2].py="lanzhou";
    28. NameList[3].py="kunming";
    29. NameList[4].py="chengdu";
    30. NameList[5].py="changchun";
    31. NameList[6].py="shenyang";
    32. NameList[7].py="xining";
    33. NameList[8].py="xian";
    34. NameList[9].py="zhengzhou";
    35. NameList[10].py="jinan";
    36. NameList[11].py="taiyuan";
    37. NameList[12].py="hefei";
    38. NameList[13].py="wuhan";
    39. NameList[14].py="changsha";
    40. NameList[15].py="nanjing";
    41. NameList[16].py="guiyang";
    42. NameList[17].py="nanning";
    43. NameList[18].py="hangzhou";
    44. NameList[19].py="nanchang";
    45. NameList[20].py="guangzhou";
    46. NameList[21].py="fuzhou";
    47. NameList[22].py="taipei";
    48. NameList[23].py="haikou";
    49. NameList[24].py="huhhot";
    50. NameList[25].py="yinchuan";
    51. NameList[26].py="urumqi";
    52. NameList[27].py="lahsa";
    53. NameList[28].py="macau";
    54. NameList[29].py="beijing";
    55. NameList[30].py="shanghai";
    56. NameList[31].py="hongkong";
    57. NameList[32].py="tianjin";
    58. NameList[33].py="chongqing";
    59. for (i=0;i
    60. {
    61. s0=0;
    62. f=NameList[i].py;
    63. for (r=0;*(f+r)!='\0';r++)
    64. /* 方法:将字符串的各个字符所对应的ASCII码相加,所得的整数做为哈希表的关键字*/
    65. s0=*(f+r)+s0;
    66. NameList[i].k=s0;
    67. }
    68. }
    69. void CreateHashList() //建立哈希表
    70. {
    71. int i;
    72. for (i=0; i
    73. {
    74. HashList[i].py="";
    75. HashList[i].k=0;
    76. HashList[i].si=0;
    77. }
    78. for (i=0;i
    79. {
    80. int sum=0;
    81. int adr=(NameList[i].k)%M; //哈希函数
    82. int d=adr;
    83. if(HashList[adr].si==0) //如果不冲突
    84. {
    85. HashList[adr].k=NameList[i].k;
    86. HashList[adr].py=NameList[i].py;
    87. HashList[adr].si=1;
    88. }
    89. else //冲突
    90. {
    91. do
    92. {
    93. d=(d+NameList[i].k%10+1)%M; //伪随机探测再散列法处理冲突
    94. sum=sum+1; //查找次数加1
    95. }while (HashList[d].k!=0);
    96. HashList[d].k=NameList[i].k;
    97. HashList[d].py=NameList[i].py;
    98. HashList[d].si=sum+1;
    99. }
    100. }
    101. }
    102. int FindList() //查找
    103. {
    104. char name[20]={0};
    105. int s0=0,r,sum=1,adr,d;
    106. printf("\n请输入城市名称:");
    107. scanf("%s",name);
    108. for (r=0;r<20;r++) //求出姓名的拼音所对应的整数(关键字)
    109. s0+=name[r];
    110. adr=s0%M; //使用哈希函数
    111. d=adr;
    112. if(HashList[adr].k==s0) //分3种情况进行判断
    113. {
    114. printf("\n名称:%s 关键字:%d 查找长度为: 1",HashList[d].py,s0);
    115. cout<
    116. return 0;
    117. }
    118. else if (HashList[adr].k==0)
    119. {
    120. printf("无此记录!");
    121. cout<
    122. return 1;
    123. }
    124. else
    125. {
    126. int g=0;
    127. do
    128. {
    129. d=(d+s0%10+1)%M; //伪随机探测再散列法处理冲突
    130. sum=sum+1;
    131. if (HashList[d].k==0)
    132. {
    133. printf("无此记录! ");
    134. cout<
    135. g=1;
    136. return 1;
    137. }
    138. if (HashList[d].k==s0)
    139. {
    140. printf("\n名称:%s 关键字:%d 查找长度为:%d",HashList[d].py,s0,sum);
    141. cout<
    142. g=1;
    143. return 0;
    144. }
    145. }while(g==0);
    146. }
    147. }
    148. void Display() // 显示哈希表
    149. {
    150. int i;
    151. float average=0;
    152. for(i=0; i
    153. {
    154. if(HashList[i].k%M==0)
    155. HashList[i].py="";
    156. }
    157. printf("\n\n地址\t关键字\t\t搜索长度\tH(key)\t 名称\n"); //显示的格式
    158. for(i=0; i
    159. {
    160. printf("%d ",i);
    161. printf("\t%d ",HashList[i].k);
    162. printf("\t\t%d ",HashList[i].si);
    163. printf("\t\t%d ",HashList[i].k%M);
    164. printf("\t %s ",HashList[i].py);
    165. //cout<<" "<<
    166. printf("\n");
    167. //cout<<<" "<<<" "<<<" "<<<" "<<
    168. }
    169. for (i=0;i
    170. average+=HashList[i].si;
    171. average/=NAME_NO;
    172. printf("\n\n平均查找长度:ASL(%d)=%f \n\n",NAME_NO,average);
    173. }
    174. void DeleteList()
    175. {
    176. char name[20]={0};
    177. int s0=0,r,sum=1,adr,d;
    178. printf("\n请输入城市名称:");
    179. scanf("%s",name);
    180. for (r=0;r<20;r++) //求出姓名的拼音所对应的整数(关键字)
    181. s0+=name[r];
    182. adr=s0%M; //使用哈希函数
    183. d=adr;
    184. if(HashList[adr].k==s0) //分3种情况进行判断
    185. {
    186. printf("\n名称:%s 关键字:%d 查找长度为: 1",HashList[d].py,s0);
    187. cout<
    188. cout<<"删除成功!"<
    189. s0=0;
    190. HashList[d].py=""; //名字的拼音
    191. HashList[d].k=0; //拼音所对应的整数
    192. HashList[d].si=0;
    193. }
    194. else if (HashList[adr].k==0)
    195. printf("无此记录!无法执行删除操作!");
    196. else
    197. {
    198. int g=0;
    199. do
    200. {
    201. d=(d+s0%10+1)%M; //伪随机探测再散列法处理冲突
    202. sum=sum+1;
    203. if (HashList[d].k==0)
    204. {
    205. printf("无此记录!无法执行删除操作!");
    206. g=1;
    207. }
    208. if (HashList[d].k==s0)
    209. {
    210. printf("\n名称:%s 关键字:%d 查找长度为:%d",HashList[d].py,s0,sum);
    211. cout<
    212. cout<<"已删除成功!"<
    213. s0=0;
    214. HashList[d].py=""; //名字的拼音
    215. HashList[d].k=0; //拼音所对应的整数
    216. HashList[d].si=0;
    217. //Display();
    218. g=1;
    219. }
    220. }while(g==0);
    221. }
    222. }
    223. void EnterList()
    224. {
    225. /*char name[20]={0};
    226. int s0=0,r,sum=1,adr,d,h;
    227. printf("\n请输入姓名的拼音:");
    228. scanf("%s",name);
    229. for (r=0;r<20;r++) //求出姓名的拼音所对应的整数(关键字)
    230. s0+=name[r];*/
    231. char st[20];
    232. char *xin;
    233. xin=st;
    234. int s0=0,r,sum=1,adr,d,h;
    235. printf("\n请输入城市名称的拼音:");
    236. cin>>xin;
    237. //cout<<
    238. for (r=0;*(xin+r)!='\0';r++)
    239. {
    240. /* 方法:将字符串的各个字符所对应的ASCII码相加,所得的整数做为哈希表的关键字*/
    241. s0=(int)(*(xin+r))+s0;
    242. }
    243. //cout<<
    244. adr=s0%M; //使用哈希函数
    245. d=adr;
    246. if(HashList[adr].k==s0) //分3种情况进行判断
    247. {
    248. printf("\n名称:%s 关键字:%d 查找长度为: 1",HashList[d].py,s0);
    249. cout<
    250. cout<<"已存在于表中,无需插入!"<
    251. }
    252. else if (HashList[d].k==0)
    253. {
    254. printf("插入成功!");
    255. HashList[d].py=xin;
    256. HashList[d].k=s0;
    257. HashList[d].si=1;
    258. h=1;
    259. cout<
    260. }
    261. else
    262. {
    263. int g=0,h=0;
    264. do
    265. {
    266. d=(d+s0%10+1)%M; //伪随机探测再散列法处理冲突
    267. sum=sum+1;
    268. if (HashList[d].k==0)
    269. {
    270. printf("插入成功!");
    271. HashList[d].py=xin;
    272. HashList[d].k=s0;
    273. HashList[d].si=sum;
    274. h=1;
    275. cout<
    276. g=1;
    277. }
    278. if (HashList[d].k==s0)
    279. {
    280. printf("\n名称:%s 关键字:%d 查找长度为:%d",HashList[d].py,s0,sum);
    281. cout<
    282. cout<<"已存在于表中,无需插入!"<
    283. g=1;
    284. }
    285. }while(g==0);
    286. }
    287. if(h==0)
    288. return;
    289. else
    290. {
    291. NAME_NO++;
    292. NameList[NAME_NO-1].py=xin;
    293. int sum=0;
    294. int adr=(NameList[NAME_NO-1].k)%M; //哈希函数
    295. int d=adr;
    296. if(HashList[adr].si==0) //如果不冲突
    297. {
    298. HashList[adr].k=NameList[NAME_NO-1].k;
    299. HashList[adr].py=NameList[NAME_NO-1].py;
    300. HashList[adr].si=1;
    301. }
    302. else //冲突
    303. {
    304. do
    305. {
    306. d=(d+NameList[NAME_NO-1].k%10+1)%M; //伪随机探测再散列法处理冲突
    307. sum=sum+1; //查找次数加1
    308. }while (HashList[d].k!=0);
    309. HashList[d].k=NameList[NAME_NO-1].k;
    310. HashList[d].py=NameList[NAME_NO-1].py;
    311. HashList[d].si=sum+1;
    312. }
    313. }
    314. }
    315. void main()
    316. {
    317. char ch1;
    318. printf("\n 哈希表\n");
    319. printf(" *-------------------------------------------*\n");
    320. printf(" | D. 显示哈希表 |\n");
    321. printf(" | F. 查找 |\n");
    322. printf(" | S. 删除 |\n");
    323. printf(" | E. 插入 |\n");
    324. printf(" | Q. 退出 |\n");
    325. printf(" *-------------------------------------------*\n");
    326. InitNameList();
    327. CreateHashList ();
    328. while(1)
    329. {
    330. printf("\n Option-:");
    331. fflush(stdin);
    332. ch1=getchar();
    333. if (ch1=='D'||ch1=='d')
    334. Display();
    335. else if (ch1=='F'||ch1=='f')
    336. FindList();
    337. else if (ch1=='S'||ch1=='s')
    338. DeleteList();
    339. else if (ch1=='E'||ch1=='e')
    340. EnterList();
    341. else if (ch1=='Q'||ch1=='q')
    342. return;
    343. else
    344. {
    345. printf("\n请输入正确的选择!");
    346. }
    347. }
    348. }


沪ICP备19023445号-2号
友情链接