散列表
一、 作业要求:
【问题描述】设计散列表实现电话号码查找系统。
【基本要求】
1) 设每个记录有下列数据项:电话号码、用户名、地址;
2) 从键盘输入各记录,分别以电话号码和用户名为关键字建立散列 表;
3) 采用一定的方法解决冲突;
4) 查找并显示给定电话号码的记录;
5) 查找并显示给定用户名的记录。
【进一步完成内容】
1) 系统功能的完善;
2) 设计不同的散列函数,比较冲突率;
3) 在散列函数确定的前提下,尝试各种不同类型处理冲突的方法,考察平均查找长度的变化。
二、 设计分析:
用散列表实现电话号码查找系统,采用和电话号码为关键字,动态分配存储空间,根据和电话号码分别进行哈希排序建立不同的数组分别存放和电话号码,能实现电话号码信息的插入、删除、查找、保存等操作,采取线性探测法解决冲突。
三、 逻辑结构:
电话号码查找系统,逻辑上应当是每个结点含有一个人所有的信息,在查找的时候可以通过不同的查找方式对不同的信息进行查找,人和人之间的关系应当是独立的,添加结点的时候对每个人由系统分配新的结点,但是不同人结点中所包含的信息则具有相同的格式,比如每个结点中的、地址、电话号码都具有相同的格式,在进行物理存储的时候可以建立相同的数组来放置同类信息。
四、 存储结构:
所设计的程序采用数组存放各类相同的信息,先建立数组进行初始化,再把不同的结点通过哈希排序以及线性探测的结果存放入对应的数组,建立的数组有两个,分别以和电话号码建立哈希表,对信息进行存储,以后的各种操作,比如查找,散列等都建立在相应的哈希表的基础上,各个信息之间通过链表相连,在查找的时候可以充分利用哈希表查找的快速性,形象化的存储结构如下图:
五、 算法设计:
六、 实现代码:
#include
#include
#include
#include
#include
#define NULL 0
unsigned int key;
unsigned int key1;
unsigned int key2;
int *p;
struct node //建节点
{
char name[8],address[20];
char num[11];
node *next;
};
typedef node *pnode;
typedef node *mingzi;
node **phone;
node **nam;
node *a;
using namespace std; //使用名称空间
hash(char num[11]) //建表,以人的电话号码为关键字,建立相应的散列表若哈希地址发生冲突,进行冲突处理 。
{
int i = 3,j;
key1=(int)num[2];
while(num[i]!=NULL)
{
key1+=(int)num[i];
i++;
}
key1=key1%20;
for(j=0;j<20;j++) //线性探测法解决冲突
{
key=(key1+j)%20;
if(phone[key]->num=="")
break;
}
return(key);
}
hash2(char name[8]) //建表,以人的为关键字,建立相应的散列表
//若哈希地址发生冲突,进行冲突处理
{
int i = 1,j;
key2=(int)name[0];
while(name[i]!=NULL)
{
key2+=(int)name[i];
i++;
}
key2=key2%20;
for(j=0;j<20;j++) //线性探测法解决冲突
{
key=(key2+j)%20;
if(phone[key]->name=="")
break;
}
return(key);
}
node *input() //输入节点
{
node *temp;
temp = new node;
temp->next=NULL;
cout<<"输入:"< cin>>temp->name;
cout<<"输入地址:"< cin>>temp->address;
cout<<"输入电话:"< cin>>temp->num;
retur