#include <iostream>
#include <cstdio>
#include <string>
#include <fstream>
using namespace std;
struct Phone
{
string name;
string number;
Phone():name(""),number(""){}//初始化为空
};
class MyPhone
{
public:
MyPhone(ifstream &fin)//以文件输入流作为参数的构造函数
{
Input(fin);
}
bool Find(string &a,int ranks)
{
for(int i=0;i<length;i++)
{
if(data[ranks][i].name==a)
{
cout <<"已有此记录"<<endl;
return 1;
}
}
return 0;
}
void Input(ifstream &fin)
{
while(fin)
{
string s;
fin>>s;
int pos=s.find(',',0);//判断有无逗号,确定其位置
if(pos==-1)//实现查找功能
{
int flag=0;//判断当前位置是否为空的标记
int ranks=s[0]-65;
for(int i=0;i<length;i++)
{
if(data[ranks][i].name!="")
{
flag=1;
cout<<data[ranks][i].name<<","<<data[ranks][i].number<<endl;
}
}
if(flag==0)cout<<"无记录"<<endl;//当前位置为空
}
else
{
int flag=0;
int ranks=s[0]-65;
string a,b;
a.assign(s,0,pos);//复制逗号之前的
b.assign(s,pos+1,s.length()-pos-1);//复制逗号之后的
flag=Find(a,ranks);
if(flag==0)//没有此记录
{
for(int i=0;i<length;i++)//使用线性探测再散列的方法处理冲突
{
if(data[ranks][i].name=="")
{
data[ranks][i].name.assign(a);
data[ranks][i].number.assign(b);
break;
}
}
cout<<"输入成功"<<endl;
}
}
}
}
private:
Phone data[26][5];
int length=5;//哈希表的长度
};
int main()
{;
ifstream fin("data.txt");
MyPhone v(fin);
return 0;
}
/*
测试数据
Waaa,1111
Waaa,1111
Wa
*/
用哈希表编程实现一个电话本,电话本中记录的数据项为(姓名拼音,电话),例如(LiSi,17012345678)。
要求:
1、用面向对象的方法编程实现电话本类;
2、使用一维数组实现哈希表;
3、取姓名拼音中第一个字母在字母表中的序号作为哈希函数;
4、使用线性探测再散列的方法处理冲突。
注意:
1、拼音字母不区分大小写
2、输入输出格式为:
(输入)WangSan,12345678
(输出)录入成功
(输入)WangSan,12345678
(输出)已有此记录
(输入)Wan
(输出)WangSan,12345678
WanWu,26745678
(输入)Li
(输出)无记录