作者:hacker发布时间:2022-07-12分类:网站入侵浏览:273评论:1
HASH函数里 scanf("%s",namekey); 去掉namekey前的号。namekey已经是一个指针了,不需要再取地址。
#includeiostream
#includestring
using namespace std;
#define HASH_LENGTH 50 //哈希表的长度
#define M 47 //随机数
#define NAME_NO 30 //人名的个数
typedef struct
{ char *py; //名字的拼音
int k; //拼音所对应的整数
}NAME;
NAME NameList[HASH_LENGTH]; //全局变量NAME
typedef struct //哈希表
{ char *py; //名字的拼音
int k; //拼音所对应的整数
int si; //查找长度
}HASH;
HASH HashList[HASH_LENGTH]; //全局变量HASH
void InitNameList() //姓名(结构体数组)初始化
{ char *f;
int r,s0,i;
for (i=0; iHASH_LENGTH; i++)//★
{//★
NameList[i].py = new char[64];//★
NameList[i].py[0] = 0;//★
}//★
strcpy(NameList[0].py, "baojie");//★
strcpy(NameList[1].py, "chengaoyang");//★
strcpy(NameList[2].py, "chenguangzhong");//★
strcpy(NameList[3].py, "chenliangliang");//★
strcpy(NameList[4].py, "chenyongzhou");//★
strcpy(NameList[5].py, "fengchao");//★
strcpy(NameList[6].py, "gexiangfeng");//★
strcpy(NameList[7].py, "huting");//★
strcpy(NameList[8].py, "huangpinjin");//★
strcpy(NameList[9].py, "jiangxiaojia");//★
strcpy(NameList[10].py, "laidongjie");//★
strcpy(NameList[11].py, "liyexiao");//★
strcpy(NameList[12].py, "lidaohui");//★
strcpy(NameList[13].py, "lijue");//★
strcpy(NameList[14].py, "lizhuoqun");//★
strcpy(NameList[15].py, "linfujun");//★
strcpy(NameList[16].py, "luobin");//★
strcpy(NameList[17].py, "luokeqing");//★
strcpy(NameList[18].py, "nichao");//★
strcpy(NameList[19].py, "panhuafeng");//★
strcpy(NameList[20].py, "sijun");//★
strcpy(NameList[21].py, "songzhanhui"); //★
strcpy(NameList[22].py, "sunzhengqing");//★
strcpy(NameList[23].py, "wanghaofeng");//★
strcpy(NameList[24].py, "wangjunshuai");//★
strcpy(NameList[25].py, "wangqinde");//★
strcpy(NameList[26].py, "wangzejun");//★
strcpy(NameList[27].py, "wangkeke");//★
strcpy(NameList[28].py, "weixing");//★
strcpy(NameList[29].py, "wurenke");//★
for(i=0;iNAME_NO;i++)
{
s0=0;
f=NameList[i].py;
for(r=0;*(f+r)!='\0';r++)
/* 方法:将字符串的各个字符所对应的ASCII码相加,所得的整数做为哈希表的关键字*/
s0=*(f+r)+s0;
NameList[i].k=s0;
}
}
void CreateHashList() //建立哈希表
{
int i;
for(i=0; iHASH_LENGTH;i++)
{
HashList[i].py=new char[64];//★
HashList[i].py[0] = 0; //★
HashList[i].k=0;
HashList[i].si=0;
}
for(i=0;iHASH_LENGTH;i++)
{
int sum=0;
int adr=(NameList[i].k)%M;
//哈希函数
int d=adr;
if(HashList[adr].si==0) //如果不冲突
{
HashList[adr].k=NameList[i].k;
HashList[adr].py=NameList[i].py;
HashList[adr].si=1;
}
else //冲突
{
while (HashList[d].k!=0)
{
d=(d+NameList[i].k%10+1)%M; //伪随机探测再散列法处理冲突
sum=sum+1; //查找次数加1
};
HashList[d].k=NameList[i].k;
HashList[d].py=NameList[i].py;
HashList[d].si=sum+1;
}
}
}
void FindList() //查找
{
string name;
int s0=0,r,sum=1,adr,d;
cout"请输入姓名的拼音:"endl;
cinname;;
for(r=0;r20;r++) //求出姓名的拼音所对应的整数(关键字)
s0+=name[r];
adr=s0%M; //使用哈希函数
d=adr;
if(HashList[adr].k==s0) //分3种情况进行判断
cout"姓名:"HashList[d].py" ""关键字:"s0" ""查找长度为: 1"endl;
else if (HashList[adr].k==0)
cout"无此记录!"endl;
else
{
int g=0;
while(g==0)
{
d=(d+s0%10+1)%M; //伪随机探测再散列法处理冲突
sum=sum+1;
if(HashList[d].k==0)
{
cout"无此记录!"endl;
g=1;
}
if(HashList[d].k==s0)
{
cout"姓名:"HashList[d].py" ""关键字:"s0" ""查找长度为:"sumendl;
g=1;
}
};
}
}
void Display() // 显示哈希表
{
int i;
float average=0;
cout"\n地址\t关键字\t\t搜索长度\tH(key)\t 姓名\n"; //显示的格式
for(i=0; i50; i++)
{
couti" ";
cout"\t"HashList[i].k" ";
cout"\t\t"HashList[i].si" ";
cout"\t\t"(HashList[i].k%M)" ";
cout"\t "HashList[i].py" ";
cout"\n";
}
for(i=0;iHASH_LENGTH;i++)
average+=HashList[i].si;
average/=NAME_NO;
cout"平均查找长度:ASL("NAME_NO")="averageendl;
}
int main()
{
char x;
InitNameList();
CreateHashList ();
cout"d. 显示哈希表 f. 查找 任意键退出 请选择:"endl;
while(cinx)
{
if(x=='d')
{
Display();
coutendl;
}
else if(x=='f')
{
FindList();
coutendl;
}
else break;
}
for (int i=0; iHASH_LENGTH; i++)//★
{
free(NameList[i].py);//★
free(HashList[i].py);//★
}//★
return 0;
}
希望能帮助到你。
#include stdio.h
#includemalloc.h
#includestring.h
//#include
#define HASH_LEN 50 //哈希表的长度
#define M 47
#define NAME_NO 30 //人名的个数
typedef struct NAME
{
char *py; //名字的拼音
int k; //拼音所对应的整数
}NAME;
NAME NameList[HASH_LEN];
typedef struct hterm //哈希表
{
char *py; //名字的拼音
int k; //拼音所对应的整数
int si; //查找长度
}HASH;
HASH HashList[HASH_LEN];
/*-----------------------姓名(结构体数组)初始化---------------------------------*/
void InitNameList()
{ int i;
char *f;
int r,s0;
NameList[0].py="chenghongxiu";
NameList[1].py="yuanhao";
NameList[2].py="yangyang";
NameList[3].py="zhanghen";
NameList[4].py="chenghongxiu";
NameList[5].py="xiaokai";
NameList[6].py="liupeng";
NameList[7].py="shenyonghai";
NameList[8].py="chengdaoquan";
NameList[9].py="ludaoqing";
NameList[10].py="gongyunxiang";
NameList[11].py="sunzhenxing";
NameList[12].py="sunrongfei";
NameList[13].py="sunminglong";
NameList[14].py="zhanghao";
NameList[15].py="tianmiao";
NameList[16].py="yaojianzhong";
NameList[17].py="yaojianqing";
NameList[18].py="yaojianhua";
NameList[19].py="yaohaifeng";
NameList[20].py="chengyanhao";
NameList[21].py="yaoqiufeng";
NameList[22].py="qianpengcheng";
NameList[23].py="yaohaifeng";
NameList[24].py="bianyan";
NameList[25].py="linglei";
NameList[26].py="fuzhonghui";
NameList[27].py="huanhaiyan";
NameList[28].py="liudianqin";
NameList[29].py="wangbinnian";
for (i=0;iNAME_NO;i++)// *求出各个姓名的拼音所对应的整数
{
s0=0;
f=NameList[i].py;
for (r=0;*(f+r) != '\0';r++) //方法:将字符串的各个字符所对应的ASCII码相加,所得的整数做为哈希表的关键字
s0=*(f+r)+s0;
NameList[i].k=s0;
}
}
/*-----------------------建立哈希表---------------------------------*/
void CreateHashList()
{int i;
for ( i=0; iHASH_LEN;i++)//哈希表的初始化
{
HashList[i].py="";
HashList[i].k=0;
HashList[i].si=0;
}
for (i=0; iNAME_NO;)
{
int sum=0;
int adr=(NameList[i].k) % M; //哈希函数
int d=adr;
if(HashList[adr].si==0) //如果不冲突
{
HashList[adr].k=NameList[i].k;
HashList[adr].py=NameList[i].py;
HashList[adr].si=1;
}
else //冲突
{
do
{
d=(d+((NameList[i].k))%10+1)%M; //伪散列
sum=sum+1; //查找次数加1
}while (HashList[d].k!=0);
HashList[d].k=NameList[i].k;
HashList[d].py=NameList[i].py;
HashList[d].si=sum+1;
}i++;
}
}
/*-------------------------------------查找------------------------------------*/
void FindList()
{ int r;
char name[20]={0};
int s0=0;
int sum=1;
int adr;
int d;
printf("\n\n请输入姓名的拼音: "); //输入姓名
scanf("%s",name);
for ( r=0;r20;r++) //求出姓名的拼音所对应的整数(关键字)
s0+=name[r];
adr=s0 % M; //使用哈希函数
d=adr;
if(HashList[adr].k==s0) //分3种情况进行判断
printf("\n姓名:%s 关键字:%d 查找长度为: 1",HashList[d].py,s0);
else if (HashList[adr].k==0)
printf("无该记录!");
else
{
int g=0;
do
{
d=(d+s0%10+1)%M; //伪散列
sum=sum+1;
if (HashList[d].k==0)
{
printf("无记录! ");
g=1;
}
if (HashList[d].k==s0)
{
printf("\n姓名:%s 关键字:%d 查找长度为:%d",HashList[d].py,s0,sum);
g=1;
}
}while(g==0);
}
}
/*--------------------------------显示哈希表----------------------------*/
void Display()
{int i;
float average=0;
printf("\n\n地址\t关键字\t\t搜索长度\tH(key)\t\t拼音 \n"); //显示的格式
for( i=0; i15; i++)
{
printf("%d ",i);
printf("\t%d ",HashList[i].k);
printf("\t\t%d ",HashList[i].si);
printf("\t\t%d ",(HashList[i].k)%M);
printf("\t %s ",HashList[i].py);
printf("\n");
}
// printf("按任意键继续显示...\n"); //由于数据比较多,所以分屏显示(以便在Win9x/DOS下能看到所有的数据)
// getch();
for( i=15; i30; i++)
{
printf("%d ",i);
printf("\t%d ",HashList[i].k);
printf("\t\t%d ",HashList[i].si);
printf("\t\t%d ",(HashList[i].k)%M);
printf("\t %s ",HashList[i].py);
printf("\n");
}
// printf("按任意键继续显示...\n");
// getch();
for( i=30; i40; i++)
{
printf("%d ",i);
printf("\t%d ",HashList[i].k);
printf("\t\t%d ",HashList[i].si);
printf("\t\t%d ",(HashList[i].k)%M);
printf("\t %s ",HashList[i].py);
printf("\n");
}
//printf("按任意键继续显示...\n");
//getch();
for( i=40; i50; i++)
{
printf("%d ",i);
printf("\t%d ",HashList[i].k);
printf("\t\t%d ",HashList[i].si);
printf("\t\t%d ",(HashList[i].k)%M);
printf("\t %s ",HashList[i].py);
printf("\n");
}
for (i=0;iHASH_LEN;i++)
{average+=HashList[i].si;
average/=NAME_NO;
printf("\n\n平均查找长度:ASL(%d)=%f \n\n",NAME_NO,average);
}
}
/*--------------------------------主函数----------------------------*/
void main()
{
/* ::SetConsoleTitle("哈希表操作"); //Windows API函数,设置控制台窗口的标题
HANDLE hCon = ::GetStdHandle(STD_OUTPUT_HANDLE); //获得标准输出设备的句柄
::SetConsoleTextAttribute(hCon, 10|0); //设置文本颜色
*/
printf("\n------------------------哈希表的建立和查找----------------------");
InitNameList();
CreateHashList ();
while(1)
{ char ch1;
printf("\n\n");
printf(" 1. 显示哈希表\n");
printf(" 2. 查找\n");
printf(" 3. 退出\n");
err:
scanf("%c",ch1);
if (ch1=='1')
Display();
else if (ch1=='2')
FindList();
else if (ch1=='3')
return;
else
{
printf("\n请输入正确的选择!");
goto err;
}
}
}
标签:c语言哈希表查找人名
已有1位网友发表了看法:
访客 评论于 2022-07-12 04:14:30 回复
tf("\t\t%d ",HashList[i].si); printf("\t\t%d ",(HashList[i].k)%M); printf("\t %s ",H