问题描述:设计哈希表实现电话号码查询系统,实现下列功能:
(1) 假定每个记录有下列数据项:电话号码、用户名、地址。
(2) 一是从数据文件old.txt(自己现行建好)中读入各项记录,二是由系统随机产生各记录,并且把记录保存到new.txt文件中以及显示到屏幕上,记录条数不要少于30,然后分别以电话号码和用户名为关键字建立哈希表。
(3) 分别采用伪随机探测再散列法和再哈希法解决冲突。
(4) 查找并显示给定电话号码的记录;查找并显示给定用户名的记录。
(5) 将没有查找的结果保存到结果文件Out.txt中,显示查找结果前,要有提示语句。

代码:

[cpp] view plaincopy
  1. // MyHashTable.cpp : 定义控制台应用程序的入口点。
  2. 设计哈希表实现电话号码查询系统
  3. //说明:一是从文件old.txt中读取的数据自己在程序运行前建立,
  4. //      二是由系统随机生成数据,在程序运行由随机数产生器生成,并且将产生的记录保存到 new.txt文件。
  5. //存在的问题:使用随机产生的文件,在显示时出现乱码
  6. #include "stdafx.h"
  7. #include<fstream>//文件流
  8. #include<iostream>
  9. #include <string>
  10. using namespace std;
  11. const int D[] = {3,5,8,11,13,14,19,21};//预定再随机数
  12. const int HASH_MAXSIZE = 50;//哈希表长度
  13. //记录信息类型
  14. class DataInfo
  15. {
  16. public:
  17. DataInfo();//默认构造函数
  18. friend ostream& operator<<(ostream& out, const DataInfo& dataInfo); //重载输出操作符
  19. //friend class HashTable;
  20. //private:
  21. string name;//姓名
  22. string phone;//电话号码
  23. string address;//地址
  24. char sign;//冲突的标志位,'1'表示冲突,'0'表示无冲突
  25. };
  26. DataInfo::DataInfo():name(""), phone(""), address(""), sign('0')
  27. {
  28. }
  29. ostream& operator<<(ostream& out, const DataInfo& dataInfo) //重载输出操作符
  30. {
  31. cout << "姓名:" << dataInfo.name << "   电话:" << dataInfo.phone
  32. << "    地址:" << dataInfo.address << endl;
  33. return out;
  34. }
  35. //存放记录的哈希表类型
  36. class HashTable
  37. {
  38. public:
  39. HashTable();//默认构造函数
  40. ~HashTable();//析构函数
  41. int Random(int key, int i);// 伪随机数探测再散列法处理冲突
  42. void Hashname(DataInfo *dataInfo);//以名字为关键字建立哈希表
  43. int Rehash(int key, string str);// 再哈希法处理冲突   注意处理冲突还有链地址法等
  44. void Hashphone(DataInfo *dataInfo);//以电话为关键字建立哈希表
  45. void Hash(char *fname, int n);// 建立哈希表
  46. //fname 是数据储存的文件的名称,用于输入数据,n是用户选择的查找方式
  47. int Findname(string name);// 根据姓名查找哈希表中的记录对应的关键码
  48. int Findphone(string phone);// 根据电话查找哈希表中的记录对应的关键码
  49. void Outhash(int key);// 输出哈希表中关键字码对应的一条记录
  50. void Outfile(string name, int key);// 在没有找到时输出未找到的记录
  51. void Rafile();// 随机生成文件,并将文件保存在 new.txt文档中
  52. void WriteToOldTxt();//在运行前先写入数据
  53. //private:
  54. DataInfo *value[HASH_MAXSIZE];
  55. int length;//哈希表长度
  56. };
  57. HashTable::HashTable():length(0)//默认构造函数
  58. {
  59. //memset(value, NULL, HASH_MAXSIZE*sizeof(DataInfo*));
  60. for (int i=0; i<HASH_MAXSIZE; i++)
  61. {
  62. value[i] = new DataInfo();
  63. }
  64. }
  65. HashTable::~HashTable()//析构函数
  66. {
  67. delete[] *value;
  68. }
  69. void HashTable::WriteToOldTxt()
  70. {
  71. ofstream openfile("old.txt");
  72. if (openfile.fail())
  73. {
  74. cout << "文件打开错误!" << endl;
  75. exit(1);
  76. }
  77. string oldname;
  78. string oldphone;
  79. string oldaddress;
  80. for (int i=0; i<30; i++)
  81. {
  82. cout << "请输入第" << i+1 << "条记录:" << endl;
  83. cin >> oldname ;
  84. cin >> oldphone;
  85. cin >> oldaddress;
  86. openfile << oldname << "  " << oldphone << "  " << oldaddress << "," << endl;
  87. }
  88. openfile.close();
  89. }
  90. int HashTable::Random(int key, int i)// 伪随机数探测再散列法处理冲突
  91. {//key是冲突时的哈希表关键码,i是冲突的次数,N是哈希表长度
  92. //成功处理冲突返回新的关键码,未进行冲突处理则返回-1
  93. int h;
  94. if(value[key]->sign == '1')//有冲突
  95. {
  96. h = (key + D[i]) % HASH_MAXSIZE;
  97. return h;
  98. }
  99. return -1;
  100. }
  101. void HashTable::Hashname(DataInfo *dataInfo)//以名字为关键字建立哈希表
  102. {//利用除留取余法建立以名字为关键字建立的哈希函数,在发生冲突时调用Random函数处理冲突
  103. int i = 0;
  104. int key = 0;
  105. for (int t=0; dataInfo->name[t]!='\0'; t++)
  106. {
  107. key = key + dataInfo->name[t];
  108. }
  109. key = key % 42;
  110. while(value[key]->sign == '1')//有冲突
  111. {
  112. key = Random(key, i++);//处理冲突
  113. }
  114. if(key == -1) exit(1);//无冲突
  115. length++;//当前数据个数加
  116. value[key]->name = dataInfo->name;
  117. value[key]->address = dataInfo->address;
  118. value[key]->phone = dataInfo->phone;
  119. value[key]->sign = '1';//表示该位置有值
  120. //cout << value[key]->name << "  " << value[key]->phone << "  "  << value[key]->address << endl;
  121. }
  122. int HashTable::Rehash(int key, string str)// 再哈希法处理冲突
  123. {//再哈希时使用的是折叠法建立哈希函数
  124. int h;
  125. int num1 = (str[0] - '0') * 1000 + (str[1] - '0') * 100 + (str[2] - '0') * 10 + (str[3] - '0');
  126. int num2 = (str[4] - '0') * 1000 + (str[5] - '0') * 100 + (str[6] - '0') * 10 + (str[7] - '0');
  127. int num3 = (str[8] - '0') * 100  + (str[9] - '0') * 10  + (str[10] - '0');
  128. h = num1 + num2 + num3;
  129. h = (h + key) % HASH_MAXSIZE;
  130. return h;
  131. }
  132. void HashTable::Hashphone(DataInfo *dataInfo)//以电话为关键字建立哈希表
  133. {//利用除留取余法建立以电话为关键字建立的哈希函数,在发生冲突时调用Rehash函数处理冲突
  134. int key = 0;
  135. int t;
  136. for(t=0; dataInfo->phone[t] != '\0'; t++)
  137. {
  138. key = key + dataInfo->phone[t];
  139. }
  140. key = key % 42;
  141. while(value[key]->sign == '1')//有冲突
  142. {
  143. key = Rehash(key, dataInfo->phone);
  144. }
  145. length++;//当前数据个数加
  146. value[key]->name = dataInfo->name;
  147. value[key]->address = dataInfo->address;
  148. value[key]->phone = dataInfo->phone;
  149. value[key]->sign = '1';//表示该位置有值
  150. }
  151. void HashTable::Outfile(string name, int key)//在没有找到时输出未找到的记录
  152. {
  153. ofstream fout;
  154. if((key == -1)||(value[key]->sign == '0'))//判断哈希表中没有记录
  155. {
  156. fout.open("out.txt",ios::app);//打开文件
  157. if(fout.fail())
  158. {
  159. cout << "文件打开失败!" << endl;
  160. exit(1);
  161. }
  162. fout << name << endl;//将名字写入文件,有个问题,每次写入的时候总是将原来的内容替换了
  163. fout.close();
  164. }
  165. }
  166. void HashTable::Outhash(int key)//输出哈希表中关键字码对应的记录
  167. {
  168. if((key==-1)||(value[key]->sign=='0'))
  169. cout << "没有找到这条记录!" << endl;
  170. else
  171. {
  172. for(unsigned int i=0; value[key]->name[i]!='\0'; i++)
  173. {
  174. cout << value[key]->name[i];
  175. }
  176. for(unsigned int i=0; i<10; i++)
  177. {
  178. cout << " ";
  179. }
  180. cout << value[key]->phone;
  181. for(int i=0; i<10; i++)
  182. {
  183. cout << " ";
  184. }
  185. cout << value[key]->address << endl;
  186. }
  187. }
  188. void HashTable::Rafile()//随机生成文件,并将文件保存在new.txt文档中
  189. {
  190. ofstream fout;
  191. fout.open("new.txt");//打开文件,等待写入
  192. if(fout.fail())
  193. {
  194. cout << "文件打开失败!" << endl;
  195. exit(1);
  196. }
  197. for(int j=0; j<30; j++)
  198. {
  199. string name = "";
  200. for(int i=0; i<20; i++)//随机生成长个字的名字
  201. {
  202. name += rand() % 26 + 'a';//名字是由个字母组成
  203. }
  204. fout << name << "   ";//将名字写入文件
  205. string phone = "";
  206. for(int i=0; i<11; i++)//随机生成长位的电话号码
  207. {
  208. phone += rand() % 10 + '0';//电话号码是纯数字
  209. }
  210. fout << phone << "      ";//将电话号码写入文件
  211. string address = "";
  212. for(int i=0; i<29; i++)//随机生成长个字的名字
  213. {
  214. address += rand() % 26 + 'a';//地址是由个字母组成
  215. }
  216. address += ',';
  217. fout << address << endl;//将地址写入文件
  218. }
  219. fout.close();
  220. }
  221. void HashTable::Hash(char *fname, int n)//建立哈希表
  222. //fname是数据储存的文件的名称,用于输入数据,n是用户选择的查找方式
  223. //函数输入数据,并根据选择调用Hashname或Hashphone函数进行哈希表的建立
  224. {
  225. ifstream fin;
  226. int i;
  227. fin.open(fname);//读文件流对象
  228. if(fin.fail())
  229. {
  230. cout << "文件打开失败!" << endl;
  231. exit(1);
  232. }
  233. while(!fin.eof())//按行读入数据
  234. {
  235. DataInfo *dataInfo = new DataInfo();
  236. char* str = new char[100];
  237. fin.getline(str, 100, '\n');//读取一行数据
  238. if(str[0] == '*')//判断数据结束
  239. {
  240. break;
  241. }
  242. i = 0;//记录字符串数组的下标
  243. //a-z:97-122     A-Z:65-90
  244. //本程序的姓名和地址都使用小写字母
  245. while((str[i] < 97) || (str[i] > 122))//读入名字
  246. {
  247. i++;
  248. }
  249. for(; str[i]!=' '; i++)
  250. {
  251. dataInfo->name += str[i];
  252. }
  253. while(str[i] == ' ')
  254. {
  255. i++;
  256. }
  257. for(int j=0; str[i]!=' '; j++,i++)//读入电话号码
  258. {
  259. dataInfo->phone += str[i];
  260. }
  261. while(str[i] == ' ')
  262. {
  263. i++;
  264. }
  265. for(int j=0; str[i]!=','; j++,i++)//读入地址
  266. {
  267. dataInfo->address += str[i];
  268. }
  269. if(n == 1)
  270. {
  271. Hashname(dataInfo);
  272. }
  273. else
  274. {
  275. Hashphone(dataInfo);//以电话为关键字
  276. }
  277. delete []str;
  278. delete dataInfo;
  279. }
  280. fin.close();
  281. }
  282. int HashTable::Findname(string name)//根据姓名查找哈希表中的记录对应的关键码
  283. {
  284. int i = 0;
  285. int j = 1;
  286. int t;
  287. int key = 0;
  288. for(key=0, t=0; name[t] != '\0'; t++)
  289. {
  290. key = key + name[t];
  291. }
  292. key = key % 42;
  293. while((value[key]->sign == '1') && (value[key]->name != name))
  294. {
  295. key = Random(key, i++);
  296. j++;
  297. if(j >= length) return -1;
  298. }
  299. return key;
  300. }
  301. int HashTable::Findphone(string phone)//根据电话查找哈希表中的记录对应的关键码
  302. {
  303. int key = 0;
  304. int t;
  305. for(t=0; phone[t] != '\0' ; t++)
  306. {
  307. key = key + phone[t];
  308. }
  309. key = key % 42;
  310. int j = 1;
  311. while((value[key]->sign == '1') && (value[key]->phone != phone))
  312. {
  313. key = Rehash(key, phone);
  314. j++;
  315. if(j >= length)
  316. {
  317. return -1;
  318. }
  319. }
  320. return key;
  321. }
  322. void main()
  323. {
  324. //WriteToOldTxt();
  325. int k;
  326. int ch;
  327. char *Fname;
  328. HashTable *ht = new HashTable;
  329. while(1)
  330. {
  331. system("cls");//cls命令清除屏幕上所有的文字
  332. cout << "欢迎使用本系统!" << endl << endl;
  333. cout << "请选择数据" << endl;
  334. cout << "1.使用已有数据文件" << endl;
  335. cout << "2.随机生成数据文件" << endl;
  336. cout << "0.结束" << endl;
  337. cout << "输入相应序号选择功能:";
  338. cin >> k;
  339. switch(k)
  340. {
  341. case 0:
  342. return;
  343. case 1:
  344. Fname = "old.txt";//从数据文件old.txt(自己现行建好)中读入各项记录
  345. break;
  346. case 2:
  347. ht->Rafile();
  348. Fname = "new.txt";//由系统随机产生各记录,并且把记录保存到new.txt文件中
  349. break;
  350. default:
  351. cout << "输入序号有误,退出程序。" << endl;
  352. return;
  353. }
  354. do
  355. {
  356. system("cls");
  357. cout << " 请选择查找方式" << endl;
  358. cout << "1.通过姓名查找" << endl;
  359. cout << "2.通过电话查找" << endl;
  360. cout << "输入相应序号选择功能:";
  361. cin >> ch;
  362. if((ch != 1) && (ch != 2))
  363. cout << "输入序号有误!" << endl;
  364. }while((ch != 1) && (ch != 2));
  365. ht->Hash(Fname, ch);
  366. while(ch == 1)
  367. {
  368. int choice;
  369. cout << endl << "请选择功能" << endl;
  370. cout << "1.输入姓名查找数据" << endl;
  371. cout << "2.显示哈希表" << endl;
  372. cout << "0.退出"<<endl;
  373. cout << "输入相应序号选择功能:";
  374. cin >> choice;
  375. switch(choice)
  376. {
  377. case 1:
  378. {//注意此处应该加上大括号
  379. int key1;
  380. string name;
  381. cout << "请输入姓名:";
  382. cin >> name;
  383. key1 = ht->Findname(name);
  384. ht->Outfile(name, key1);
  385. ht->Outhash(key1);
  386. }
  387. break;
  388. case 2:
  389. {
  390. for(int i=0; i<HASH_MAXSIZE; i++)
  391. {
  392. if(ht->value[i]->sign!='0')
  393. {
  394. ht->Outhash(i);
  395. }
  396. }
  397. }
  398. break;
  399. default:
  400. cout << endl << "您的输入有误!" << endl;
  401. }
  402. if(choice == 0)
  403. {
  404. return;
  405. }
  406. }
  407. while(ch == 2)
  408. {
  409. int choice;
  410. cout << endl << "请选择功能" << endl;
  411. cout << "1.输入电话查找数据" << endl;
  412. cout << "2.显示哈希表"<<endl;
  413. cout << "0.退出"<<endl;
  414. cout << "输入相应序号选择功能:";
  415. cin >> choice;
  416. switch(choice)
  417. {
  418. case 1:
  419. {
  420. int key2;
  421. string phone;
  422. cout << "请输入11位的电话号码:";
  423. do
  424. {
  425. cin >> phone;
  426. if(phone.length() != 11)
  427. {
  428. cout << "电话号码应为11位!\n请重新输入:";
  429. }
  430. }while(phone.length() != 11);
  431. key2 = ht->Findphone(phone);
  432. ht->Outfile(phone, key2);
  433. ht->Outhash(key2);
  434. }
  435. break;
  436. case 2:
  437. {
  438. for(int i=0; i<HASH_MAXSIZE; i++)
  439. {
  440. if(ht->value[i]->sign != '0')
  441. {
  442. ht->Outhash(i);
  443. }
  444. }
  445. }
  446. break;
  447. default:
  448. cout << endl << "您的输入有误!" << endl;
  449. }
  450. if(choice == 0)
  451. {
  452. return;
  453. }
  454. }
  455. while((ch != 1) && (ch != 2))
  456. {
  457. cout << "您的输入有误!请输入相应需要选择功能:";
  458. }
  459. }
  460. system("pause");
  461. }

哈希表实现电话号码查询系统(c++)相关推荐

  1. 设计散列表实现通讯录查找系统_[源码和文档分享]利用哈希表实现电话号码查询系统...

    第一章 需求分析 1.1 问题描述 设计一个电话号码查询系统,为来访的客⼈提供各种信息查询服务. 1.2 基本要求 设计每个记录有下列数据项:电话号码.用户名.地址 从键盘输入个记录,分别以电话号码和 ...

  2. C语言项目 电话查询系统 哈希表实现(项目要求 + 运行界面 + 代码分析 + 完整代码)

    电话查询系统 1. 项目要求 2. 数据样例 3. 运行界面 4. 代码分析 5. 完整代码 6. 项目报告 关注博主不迷路,博主带你码代码! 1. 项目要求 设每个记录有以下数据项:用户名.电话.地 ...

  3. 电话号码查询系统(数据结构之哈希表)

    哈希表 哈希表(Hash Table)是一种根据关键字直接访问内存存储位置的数据结构.通过哈希表,数据元素的存放位置和数据元素的关键字之间建立起某种对应关系,建立这种对应关系的函数称为哈希函数. 1. ...

  4. C语言电话号码查询系统[2023-01-16]

    C语言电话号码查询系统[2023-01-16] 一.课程设计(论文)题目 电话号码查询系统 说明: 设计哈希表,实现电话号码查询系统. 二.本次课程设计(论文)应达到的目的 C语言.面向对象程序设计. ...

  5. 《程序设计综合设计》课程设计--电话号码查询系统

    2.问题描述 1.设每个记录有下列数据项:电话号码.用户名.地址: 2.从键盘输入各记录,分别以电话号码和用户名为关键字建立哈希表: 3.查找并显示给定电话号码的记录: 4.查找并显示给定用户名的记录 ...

  6. C++利用双哈希表实现存储机制hash table的算法(附完整源码)

    C++利用双哈希表实现存储机制的算法 C++利用双哈希表实现存储机制的算法完整源码(定义,实现,main函数测试) C++利用双哈希表实现存储机制的算法完整源码(定义,实现,main函数测试) #in ...

  7. c语言哈希表电子辞典_C语言实现的哈希表实现程序

    下面我们一起来看一个C语言实现的哈希表实现程序了,这个程序没有过多的说明只是一个例子,大家有兴趣可以进入看看或测试一下. 为了巩固一下链表知识,自己实现的一个哈希表,在GCC 4.4.7下编译通过: ...

  8. 数据结构个人电话号码查询系统实验报告

    实验目的及要求 目的:通过设计一个<个人电话号码查询系统>,进一步熟悉一些二叉树的概念.以及基本知识和技能,利用所学的基本知识和技能解决简单的面向对象的程序设计问题.实现根据用户输入的信息 ...

  9. 编写电话号码查询系统

    编写电话号码查询系统 一.项目简介 设计一个通讯录管理软件,做到能够增加组.删除组. 修改组.查询好友.加好友.修改好友,删除好友,退出. (1) 通讯录的每一条信息包括姓名,手机,电话,性别,分组: ...

最新文章

  1. AlphaGo之父DeepMind再出神作,PrediNet原理详解
  2. 启用linux内核中的nfs服务
  3. 想要提升网站曝光率应避免哪些错误设置的出现?
  4. mysql下sql语句 update 字段=字段+字符串
  5. hdu1556(树状数组小地方的解释~~~)
  6. 三维重建:深度传感技术的中外差异
  7. oracle unpivot 索引_oracle 11g 行列转换之unpivot、pivot
  8. 匿名内部类与Lambda表达式
  9. mongoose 数据库设计千万要注意 Cast to [number] failed for value
  10. ctf up怎么写 write_软件测试工程师要不要写工具?
  11. 创建一个JFrame,可下拉选择显示字符串和图片
  12. Linux基础,命令的使用以及环境的安装,jdk,mysql,tomcat
  13. 设备点检php源码,设备巡检管理系统Delphi源码下载
  14. 【python】一键修改小米运动步数,同步微信、支付宝 运动步数
  15. ps复制文字到html,【答疑】PS里文字复制粘贴快捷键是什么啊? - 视频教程线上学...
  16. 体脂率在线计算机,如何简单测算出自己的体脂率?
  17. 用谷歌浏览器模拟打开天眼查网站并爬取需要的数据
  18. postgresql 11 的并行(parallel)简介
  19. Hbuilder开发移动新闻客户端(二)
  20. 别看了!我们该认认真真写博客了…

热门文章

  1. 月份和星期的英语(请不要再弄错了)
  2. 有没有可以跨平台的待办事项清单软件推荐?
  3. 先验分布/后验分布/似然估计/贝叶斯公式
  4. 码元速率、数据速率、信道带宽、信道容量、载波的概念
  5. 从键盘输入一个四位数,输出该四位数的个位,十位,百位和千位数分别是什么。
  6. 语音识别:利用百度智能进行语音识别
  7. exlc表格怎么换行_excel如何换行_表格怎么换行上下换行
  8. python opencv resize函数_OpenCV尺寸调整函数resize
  9. 影创科技孙立:江西将成为施展“鸿鹄”之志的热土
  10. 目标定位算法(二)之基于测距的定位算法