右侧
国内最专业的黑客技术博客
当前位置:网站首页 > 网站入侵 > 正文

哈希查找代码c语言_c语言哈希表查找人名

作者:hacker发布时间:2022-07-12分类:网站入侵浏览:273评论:1


导读:目录:1、C语言哈希表,为什么输入查找名字就没了音讯?(点进来有详细内容哟~)2、哈希表设计C++(首选)或C语言——针对你的班级中的人名设计一个哈希表,使得平均查找长度不...

目录:

C语言哈希表,为什么输入查找名字就没了音讯?(点进来有详细内容哟~)

HASH函数里 scanf("%s",namekey); 去掉namekey前的号。namekey已经是一个指针了,不需要再取地址。

哈希表设计C++(首选)或C语言——针对你的班级中的人名设计一个哈希表,使得平均查找长度不超过R,完成相

#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;

}

希望能帮助到你。

数据结构 哈希表,C语言解答

#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

欢迎 发表评论:

网站入侵排行
最近发表
标签列表