利用Hash查找的算法存储通讯录

问题说明
用哈希表编程实现一个电话本,电话本中记录的数据项为(姓名拼音,电话),例如(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;
}
  • 2
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值