电话号码本的快速查找

• 创建基于链地址法的hash表,并实现电话薄的管理(记录不超过20个)。
• 电话薄中的记录包括姓名、电话号码和地址三个数据项,创建两个hash表,关键字分别为姓名和电话号码
• Hash函数为姓名前两个字母/电话号码最后三个数字求和之后对17取余
• 完成记录的插入、查找、显示功能

输入0:增加一条记录。
输入1:根据输入的姓名搜索记录并输出。
输入2:根据输入的电话搜索记录并输出。
输入3:根据姓名查找表输出全部记录。
输入4:根据电话查找表输出全部记录。
输入5:退出。

#include<iostream>
#include<string.h>
#define len 17
using namespace std;
typedef struct node //create node
{char name[8];//define array for name char address[20];//define array for addresschar tel[11];//define array for telephone numnode* next;
}Person;
typedef struct Hash {Person* data;int count;int sizeindex;
}Hash;
bool makeH(Hash* table);
bool insetH(Hash* nametable, Hash* teltable, Person person);
bool searchnameH(Hash* nametable, char name[]);
bool searchtelH(Hash* teltable, char tel[]);
bool searchname(Person* head, char name[]);
bool searchtel(Person* head, char tel[]);
int getnamekey(char name[]) {return (name[0] + name[1]) % 17;
}
int gettelkey(char tel[]) {return((tel[10] - '0') * 10 + (tel[11] - '0')) % 17;
}
int main() {Hash nametable, teltable;makeH(&nametable);makeH(&teltable);Person *person, *head,*p;head = NULL;int i;char name[8], tel[11];do {cin >> i;switch (i) {case 0:person = new(Person);cin >> person->name >> person->address >> person->tel;person->next = NULL;insetH(&nametable, &teltable, *person);p = head;if (p) {while (p->next) {p = p->next;}p->next = person;}else {head = person;}break;case 1:cin >> name;if (!searchname(head, name))cout << "NULL";break;case 2:cin >> tel;if (!searchtel(head, tel))cout << "NULL";break;case 3:cin >> name;if (!searchnameH(&nametable, name))cout << "NULL";break;case 4:cin >> tel;if (!searchtelH(&teltable, tel))cout << "NULL";break;}} while (i != 5);return 0;delete []nametable.data;delete[]teltable.data;delete person;
}
bool makeH(Hash* table) {table->data = new Person[len];if (table->data == NULL)return false;int i;Person* p;p = table->data;table->count = 0;table->sizeindex = len;for (i = 0; i < len; i++) {memset(p->name, '\0', sizeof(char));memset(p->tel, '\0', sizeof(char));p++;}return true;
}
bool insetH(Hash* nametable, Hash* teltable, Person person) {int namekey, nk2, telkey, tk2, c;Person* n, * t,*s;n = nametable->data;t = teltable->data;namekey = getnamekey(person.name);telkey = gettelkey(person.tel);c = 0;int l = strlen((n + namekey)->name);if (l == 0) {memcpy(n + namekey, &person, sizeof(person));nametable->count++;s = n + namekey;}else {nk2 = namekey;do {c++;nk2 = (nk2 + c) % len;} while (strlen((n + namekey)->name) != 0 && c < len);if (c >= len) {cout << "error" << endl;return false;}else {memcpy(n + nk2, &person, sizeof(person));nametable->count++;}}c = 0;l = 0;if (l == 0) {memcpy(t + telkey, &person, sizeof(person));teltable->count++;}else {tk2 = telkey;do {c++;tk2 = (tk2 + c) % len;} while (strlen((t + telkey)->tel) != 0 && c < len);if (c >= len) {cout << "error" << endl;return false;}else {memcpy(t + tk2, &person, sizeof(person));teltable->count++;}}return true;
}
bool searchnameH(Hash* nametable, char name[]) {int key, c;Person* p;key = getnamekey(name);p = nametable->data;if (strlen((p + key)->name) == 0)return false;else if (strcmp((p + key)->name , name)!=0) {c = 0;do {c++;key = key + c;} while (strcmp((p + key)->name, name) != 0 && c < len);if (c >= len)return false;else {cout << (p + key)->name << ' ' << (p + key)->address << ' ' << (p + key)->tel;return true;}}else {cout << (p + key)->name << ' ' << (p + key)->address << ' ' << (p + key)->tel;return true;}}
bool searchtelH(Hash* teltable, char tel[]) {int key, c;Person* p;key = gettelkey(tel);p = teltable->data;if (strlen((p + key)->tel) == 0)return false;else if (strcmp((p + key)->tel , tel)!=0) {c = 0;do {c++;key = key + c;} while (strcmp((p + key)->tel, tel)!=0 && c < len);if (c >= len)return false;else {cout << (p + key)->name << ' ' << (p + key)->address << ' ' << (p + key)->tel;return true;}}else {cout << (p + key)->name << ' ' << (p + key)->address << ' ' << (p + key)->tel;return true;}
}
bool searchname(Person* head, char name[]) {Person* p;p = head;while (p != NULL && strcmp(p->name , name)!=0) {p = p->next;}if (p == NULL) {return false;}else {cout << p->name << ' ' << p->address << ' ' << p->tel;return true;}
}
bool searchtel(Person* head, char tel[]) {Person* p;p = head;while (p != NULL && strcmp(p->tel, tel) != 0) {p = p->next;}if (p == NULL) {return false;}else {cout << p->name << ' ' << p->address << ' ' << p->tel;return true;}
}

电话号码本的快速查找相关推荐

  1. java快速查找算法_Java实现的快速查找算法示例

    本文实例讲述了Java实现的快速查找算法.分享给大家供大家参考,具体如下: 快速查找算法,可以根据想要找的是第几个大的数,每次循环都能固定下来一个数在数组完整排完序之后的位置,每次循环都能定一个数的位 ...

  2. python使用heapq快速查找最大或最小的 N 个元素

    python使用heapq快速查找最大或最小的 N 个元素 heapq实现了一个适合与Python的列表一起使用的最小堆排序算法. 堆是非线性的树形的数据结构,有两种堆,最大堆与最小堆.( heapq ...

  3. Kali渗透测试——快速查找Metasploit的模块

    快速查找Metasploit的模块 在渗透测试过程中,通过NMAP可以获取目标主机服务和操作系统信息:通过Nessus和OpenVAS可以获取目标主机存在的漏洞:或者,通过其他工具获取到关键信息.这时 ...

  4. win2003服务器记录文件夹,在Windows Server 2003里快速查找文件

    用Windows Server 2003的Agent Ransack??专业文件定位器(File Locator Pro)应用程序快速查找文件. 随着各种规模的组织的数据存储需求不断增加,同时法规监管 ...

  5. 快速查找所有存储过程/触发器中是否包含某个字符串

    select name from sysobjects o, syscomments s where o.id = s.id and text like '%CASIGN%' and o.xtype ...

  6. 【逆向分析】快速查找指定代码的几种方法

    前言 每个人在调试中快速查找所需代码时都有不同的方法,但是最基本最常用的有下面几种. 学习这4种方法前我们需要思考一个问题.我们知道,运行HelloWorld.exe程序会弹出一个消息框,显示&quo ...

  7. 数据结构-单链表进阶之快慢指针原理(快速查找法)

    面试题:快速找到未知长度单链表的中间节点? 这个问题的解决方法分为普通方法和高级方法. 1.普通方法即我们大家都能一下子想到的,首先遍历一遍获取总长度L,然后再次遍历循环至L/2即可:时间复杂度为: ...

  8. (私人收藏)[开发必备]HTML5最全快速查找离线手册(可查询可学习,带实例)...

    [开发必备]HTML5最全快速查找离线手册(可查询可学习,带实例) HTML5最全快速查找离线手册:https://pan.baidu.com/s/19seE8TJQSx4IsWgXtKQS0A j9 ...

  9. C++Rabin Karp算法字符串快速查找(附完整源码)

    C++Rabin Karp算法字符串快速查找 C++Rabin Karp算法字符串快速查找完整源码(定义,实现,main函数测试) C++Rabin Karp算法字符串快速查找完整源码(定义,实现,m ...

  10. c++标准模板库STL【快速查找】【最全】【常用】【语法】

    c++标准模板库STL[快速查找][最全][常用][语法] c标准模板库STL快速查找最全常用语法         vector- 变长数组         set-内部自动有序且不含重复元素     ...

最新文章

  1. 大数据工作的正确打开姿势
  2. Get Form type using javascript in CRM 2011
  3. Java-Map从入门到性能分析1【Map初识、Map通用方法、HashMap的使用(遍历方法、性能分析)】
  4. C++判断一个数字是否是某个数字的阶乘(附完整源码)
  5. 【渝粤题库】国家开放大学2021春2246社会工作概论题目
  6. HOSTNAME问题 和yum配置163源的操作 安装lsb_release,KSH,CSH
  7. springMVC一些实践总结
  8. python今日内容_python笔记15
  9. AAAI2020中的四篇推荐系统好文(附论文下载链接)
  10. Python之Pandas库常用函数大全(含注释)
  11. 捐赠3亿元驰援疫情后,腾讯再出2亿元发起“战疫开发者公益联盟”
  12. java jdbc close原理_Java开发笔记(一百四十六)JDBC的应用原理
  13. 我的 Python3.x 的开始-2018.8.3
  14. java工作流flowable
  15. NET、wap网络的区别
  16. 腾讯云学生服务器分享
  17. 华为android打开usb调试模式,华为P6 USB调试在哪 如何打开USB调试【详解】
  18. (转)无法启动服务,原因可能是已被禁用或与其相关联的设备没有启动
  19. 在金融科技的诸多技术领域,目前最引人瞩目的当属区块链
  20. BootLoader这个玩意

热门文章

  1. 在 vi 中替换字符串
  2. WPF 框架开发 加入 InternalsVisibleToAttribute 特性让其他程序集可以访问 internal 权限成员
  3. HTTP中的URL长度限制
  4. 计算机信息管理系统实训摘要,计算机实训报告摘要.doc
  5. Fortran并行计算的一些例子
  6. 【毕设教程】物联网/嵌入式/单片机毕业设计项目开发流程
  7. RBF神经网络——案例一
  8. Android自定义PreferenceScreen的Layout布局,并获取控件
  9. instantclient php,Oracle 轻量即时客户端Instant Client安装配置
  10. 三菱PLC定位控制2