【基本要求】

    (1)设每个记录有下列数据项:电话号码、用户名、地址;

    (2)从键盘输入各记录,分别以电话号码和用户名为关键字建立散列表;

    (3)采用一定的方法解决冲突;

    (4)查找并显示给定电话号码的记录;

    (5)查找并显示给定用户名的记录。

    【选做内容】

    (1)系统功能的完善;

    (2)设计不同的散列函数,比较冲突率;

 (3)在散列函数确定的前提下,尝试各种不同类型处理冲突的方法,考察平均查找长度的变化。

 

用的C++开发,基本实现了3种哈希函数+3种解决冲突的方法。因为要求同时有姓名散列与按号码散列,所以用了

flag标记每次的散列类型 ,针对不同的要求对散列函数做了个别优化。

哈希表类的结构如下

 

 1 class HashTable{
 2     public:
 3         HashTable(int size = MAXSIZE-1);
 4         ~HashTable(){ delete[]E; delete[]tag; delete[]E2; delete[]tag2; }
 5         int  hash1(string name, int flag);//哈希函数1  除数求余法
 6         int  hash2(string tel);//哈希函数2 折叠法
 7         int  hash3(string tel);//哈希函数3 数字分析法
 8         int  solve1(int hashVal, int flag);//线性探测法解决冲突
 9         int  solve2(int hashVal, int flag);//二次探测法解决冲突
10         Node*  solve3(int hashVal, int flag);//拉链法解决冲突
11         User input();//往电话薄中添加用户
12         void creat(int flag);  //创建散列表
13         void show(int flag);    //列出电话薄所有元素
14         void search(int flag,string at);  //搜索指定用户
15         void searchByNode(int flag, string at);  //拉链法搜索指定用户
16         void insert(int flag, User newUser); //插入
17         void del(int flag, string by);//删除
18         void save(int flag);//将电话薄保存至本地文件
19         int length; //要创建的电话本长度
20         Node** ht;
21     private:
22         User* E;  //用户数组  按姓名散列
23         User* E2; //用户数组2 按电话号码散列
24         int* tag; //标记散列表1每个桶的存储状态 0为空 1为实
25         int* tag2;//标记散列表2每个桶的存储状态
26         int flag;      //1表示是按姓名  2表示按电话号码 新建的哈希表
27         int maxSize;   //哈希表最大长度
28         int f;//比例因子  主要用于折叠法
29 };
View Code

相关文章:

  • 2022-12-23
  • 2021-09-01
  • 2021-08-13
  • 2021-08-21
  • 2022-01-20
  • 2022-01-02
  • 2021-12-02
  • 2021-09-28
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2021-11-20
  • 2022-01-23
  • 2022-12-23
  • 2021-11-12
  • 2022-01-03
相关资源
相似解决方案