利用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;
}
    原文作者:查找算法
    原文地址: https://blog.csdn.net/qq_37053885/article/details/73700363
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞