#include<iostream>
#include <fstream>
using namespace std;
#define MAXSIZE 50
//哈希表元素的三种状态,没有记录、有记录、有过记录但已被删除
typedef struct info
{
int num;//联系人电话
char name;
char address;
}group;//information of students
typedef struct hash
{
int max;
int len;
int elemflag[50];//元素状态,没有记录、有记录、有过记录但已被删除
group data[50];
}ha;
ha p;
void creat(){//初始化哈希表
for(int i=0;i<=49;i++)
p.elemflag[i]=0;//每个元素位置上被标记为 “没有过“
}
void list() //显示哈希表所有元素及其所在位置
{ cout<<"哈希表如下显示;"<<endl;
//显示哈希表中记录所在位置
for(int i=0;i<=49;i++) //显示哈希表中记录值
{if(p.elemflag[i]==1)
cout<<i<<"."<<"电话:"<<p.data[i].num<<"姓名:"<<p.data[i].name<<"地址:"<<p.data[i].address<<endl;
if(p.elemflag[i]==0||p.elemflag[i]==2) cout<<i<<"."<<"null"<<endl;}
}
int find(int a)//search the information by telephone number
{
int d,position;
int o=1;
position=d=a%50;//get the hash position
while(p.elemflag[d]==1&&p.data[d].num!=a)//该位置填有记录并且关键字不相等
{ d=d+o*o; //冲突处理方法:线性探测再散列
o++;
if(d>=50) d=d%50; //循环搜索 if(d==position)return 0;//整个表已搜索完,没有找到待查元素
}
if(p.data[d].num==a&&p.elemflag[d]==1) {cout<<"您所输入的联系人信息是"<<"电话:"<<p.data[d].num<<"姓名"<<p.data[d].name<<"地址"<<p.data[d].address<<endl;return 1; }//查找成功,d指示待查元素位置
//查找成功返回1
else return 0;//查找失败
//else return 0;//失败的返回0
}
int append(int n,char name,char address)//查找不成功时插入元素e到开放定址哈希表H中,并返回True,否则返回False
{ int d;
int position;
d=position=n%50;
int o=1;
while (p.elemflag[position]==1&&p.data[d].num!=n)//concept has been occupyed
{
position=position+o*o;
o++;
if(position>=50)position=position%50;
if(position==d)return 0;
}
if(p.elemflag[position]==0||p.elemflag[position]==2)
{ //表示该位置没有记录
p.data[position].num=n; //插入记录
p.data[position].name=name;
p.data[position].address=address;
p.elemflag[position]=1;
return 1;}
}
void load()
{ char wenjian[50];
ifstream in;
in.open("E:\txl.txt");
for(int i=0;i<=2;i++)
{
in.getline(wenjian[i],80);
in.getline(wenjian[i]);
in.getline(wenjian[i]);
}
out.close();
for(int i=0;i<=2;i++){
append(p.wenjian[i].num,p.wenjian[i].name,p.wenjian[i].address);}
}
int DeleteHash(int n)
{
int d,position;
int o=1;
position=d=n%50;//get the hash position
while(p.elemflag[d]==1&&p.data[d].num!=n)//该位置填有记录并且关键字不相等
{ d=d+o*o; //冲突处理方法:线性探测再散列
o++;
if(d>=50) d=d%50; //循环搜索 if(d==position)return 0;//整个表已搜索完,没有找到待查元素
}
if(p.data[d].num==n&&p.elemflag[d]==1)
{cout<<"您将要的联系人信息是"<<"电话:"<<p.data[d].num<<"姓名"<<p.data[d].name<<"地址"<<p.data[d].address<<endl;
p.elemflag[d]=2;cout<<"删除成功!"<<endl;return 1; }//查找成功,d指示待查元素位置
//查找成功返回1
else
cout<<"不存在此元素"<<endl;
//表中不存在待删元素
}
void main()
{
printf("\n\t**************************************");
printf("\n\t* 哈 希 查 找 * ");
printf("\n\t**************************************");
printf("\n\t* 1-----------------建表 *");
printf("\n\t* 2-----------------显示 *");
printf("\n\t* 3-----------------查找 *");
printf("\n\t* 4-----------------插入 *");
printf("\n\t* 5-----------------删除 *");
printf("\n\t* 6-----------------载入文件 *");
printf("\n\t* 0-----------------退出 *");
printf("\n\t**************************************");
int x;
int k= 1;
while (k)
{
printf("\n\n\t请输入菜单号:");
cin>>x; //输入操作选项
switch(x)
{
case 1:
creat();
cout<<"哈希表初始化成功!"<<endl;
break;
case 2:
list();
break;
case 3 :
cout<<"请输入要查找的电话号码:"<<endl;
int a;
cin>>a;
if(find(a)==1)
{cout<<"查找成功!";}
else cout<<"查找失败!"<<endl;
break;
case 4:
int r;
char name,address;
cout<<"请输入要插入的电话号码"<<endl;
cin>>r;
cout<<"请输入要插入的姓名"<<endl;
cin>>name;
cout<<"请输入要插入的地址"<<endl;
cin>>address;
append(r,name,address);
cout<<"插入成功!"<<endl;
break;
case 5:
int l;
cout<<"请删除要插入的电话号码"<<endl;
cin>>l;
DeleteHash(r);
break;
case 6:
load();
break;
case 0:
k=0;
break;
}
}
printf("\n\t欢迎再次使用本程序,再见!\n");
}
原文:http://www.cnblogs.com/helloaworld/p/5097728.html