问题说明
用哈希表编程实现一个电话本,电话本中记录的数据项为(姓名拼音,电话),例如(LiSi,17012345678)。
要求:
1、用面向对象的方法编程实现电话本类;
2、使用一维数组实现哈希表;
3、取姓名拼音中第一个字母在字母表中的序号作为哈希函数;
4、使用线性探测再散列的方法处理冲突。
注意:
1、拼音字母不区分大小写
2、输入输出格式为:
(输入)WangSan,12345678
(输出)录入成功
(输入)WangSan,12345678
(输出)已有此记录
(输入)Wan
(输出)WangSan,12345678
WanWu,26745678
(输入)Li
(输出)无记录
代码实现
Tel_List.h
#include <iostream>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#define Max_size 100
using namespace std;
//定义一个表示哈希表的结构体
struct List{
char str1[15] ;//存储姓名信息
char str2[15] ;//存储电话号码
};
class Telephone_num_List{
public:
Telephone_num_List();//构造函数
int Insert();//在hash表中插入元素
int Hash(char c);//求解HashAddress的函数
int Search();//查找函数
void Print();//打印Hash表的函数
private:
List* memember;//存放该电话表的结构体数组
};
/*构造函数进行初始化*/
/***函数1: * 初始化哈希表 * @param */
Telephone_num_List::Telephone_num_List()
{
memember=new List[Max_size];
for(int i=0;i<Max_size;i++)
memember[i].str1[0]='#',memember[i].str2[0]='#';
}
/***函数2: * 哈希函数(除留余数法),计算得到data对应的hash(key) * @param c 关键码的首字母 */
int Telephone_num_List::Hash(char c)
{
return int(c)%25;
}
/***函数3: * 数据插入Hash表,若出现冲突,利用开放定址的线性探测法解决冲突 * */
int Telephone_num_List::Insert()
{
int mark=0,cnt=0,length=0,k=0;
int i1,i2;
char str3[15] ; //表示姓名的字符串
char str4[15] ; //表示电话号码的字符串
char s[30];
// cout<<"请输入您要存储的联系人的姓名以及电话号码"<<endl;
while((s[length]=cin.get())!='\n')length++; //表示联系人信息的字符串,格式为: 姓名,电话号码
//分离字符串
for(int i=0;i<length;i++)
if(s[i]==','){cnt=i;break;}
if(cnt==0){cout<<"输入格式错误\n";return -1;}
// cout<<"cnt="<<cnt<<endl;
for( i1=0;i1<cnt;i1++)
str3[i1]=s[i1];//str3存姓名
str3[i1]='\0';
for( i2=cnt+1;i2<length;i2++)
str4[k]=s[i2],k++;//str4存电话号码
str4[k]='\0';
// cout<<str3<<" "<< str4<<endl;
char c=str3[0];
int HashAdress=Hash(c);//散列函数求key对应的地址HashAddress=Hash(key)
while(1){
if(memember[HashAdress].str1[0]=='#'){//如果该位置为空,则将该联系人的信息录入
for( i1=0;i1<cnt;i1++){
memember[HashAdress].str1[i1]=s[i1];//str3存姓名
}
memember[HashAdress].str1[i1]='\0';
k=0;
for( i1=cnt+1;i1<length;i1++){
memember[HashAdress].str2[k]=s[i1],k++;//str3存姓名
}
memember[HashAdress].str2[k]='\0';
mark=1;//成功的标记
cout<<"录入成功\n";
// cout<<memember[HashAdress].str1<<" "<<memember[HashAdress].str2<<endl;
}
else if(strcmp(memember[HashAdress].str1,str3 )==0)
cout<<"已有此记录\n",mark=1;//如果带联系人的信息已经录入,则停止操作
else
HashAdress=(++HashAdress)%25;//利用线性探测再散列的方法处理冲突
if(mark==1) break;
}
}
/***函数4: * 在HashTable中查找符合要求的元素 */
int Telephone_num_List::Search()
{
char s[20],cnt=0;
int length,mark=0;
while((s[length]=cin.get())!='\n')length++;
char c=s[0];
int HashAdress=Hash(c);
for(int i=HashAdress;cnt<Max_size;i++)
{
if(strncmp(memember[i].str1,s,length)==0)
cout<<memember[i].str1<<" "<<memember[i].str2<<endl,mark=1;
cnt++;
}
if(mark==0)cout<<"无记录"<<endl;
};
/***函数5: * 将HashTable中所有元素打印出来 */
void Telephone_num_List::Print()
{
int i=0;
for(;i<Max_size;i++)
{
if(memember[i].str1[0]!='#')cout<<memember[i].str1<<" "<<memember[i].str2<<endl;
}
}
main.cpp
/**********************************ЙўЯЃВщев*************************************/
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include "Tel_List.h"
using namespace std;
int main()
{
Telephone_num_List A;
A.Insert();
A.Insert();
// A.Print();
A.Search();
A.Search();
return 0;
}