哈希表c语言(C语言哈希表)

:暂无数据 2026-04-18 23:40:02 0
关于哈希表c语言,您需要知道的几个关键点,尤其是C语言哈希表的深入解析,我们都将在这篇文章中涵盖。

本文目录

C语言哈希表

/#include "iostream.h"
#include 《iostream》
#include "string.h"
#include "fstream"
#define NULL 0
unsigned int key;
unsigned int key2;
int *p;
struct node //建节点
{
char name;
char num;
node * next;
};
typedef node* pnode;
typedef node* mingzi;
node **phone;
node **nam;
node *a;
using namespace std; //使用名称空间
void hash(char num) //哈希函数
{
int i = 3;
key=(int)num;
while(num!=NULL)
{
key+=(int)num;
i++;
}
key=key%20;
}
void hash3(char name) //哈希函数
{
int i = 1;
key2=(int)name;
while(name!=NULL)
{
key2+=(int)name;
i++;
}
key2=key2%20;
}
node* input() //输入节点
{
node *temp;
temp = new node;
temp-》next=NULL;
cout《《"输入姓名:"《《endl;
cin》》temp-》name;
cout《《"输入地址:"《《endl;
cin》》temp-》address;
cout《《"输入电话:"《《endl;
cin》》temp-》num;
return temp;
}
int apend() //添加节点
{
node *newphone;
node *newname;
newphone=input();
newname=newphone;
newphone-》next=NULL;
newname-》next=NULL;
hash(newphone-》num);
hash3(newname-》name);
newphone-》next = phone-》next;
phone-》next=newphone;
newname-》next = nam-》next;
nam-》next=newname;
return 0;
}
void create() //新建节点
{
int i;
phone=new pnode;
for(i=0;i《20;i++)
{
phone=new node;
phone-》next=NULL;
}
}
void create2() //新建节点
{
int i;
nam=new mingzi;
for(i=0;i《20;i++)
{
nam=new node;
nam-》next=NULL;
}
}
void list() //显示列表
{
int i;
node *p;
for(i=0;i《20;i++)
{
p=phone-》next;
while(p)
{
cout《《p-》name《《’_’《《p-》address《《’_’《《p-》num《《endl;
p=p-》next;
}
}
}
void list2() //显示列表
{
int i;
node *p;
for(i=0;i《20;i++)
{
p=nam-》next;
while(p)
{
cout《《p-》name《《’_’《《p-》address《《’_’《《p-》num《《endl;
p=p-》next;
}
}
}
void find(char num) //查找用户信息
{
hash(num);
node *q=phone-》next;
while(q!= NULL)
{
if(strcmp(num,q-》num)==0)
break;
q=q-》next;
}
if(q)
cout《《q-》name《《"_" 《《q-》address《《"_"《《q-》num《《endl;
else cout《《"无此记录"《《endl;
}
void find2(char name) //查找用户信息
{
hash3(name);
node *q=nam-》next;
while(q!= NULL)
{
if(strcmp(name,q-》name)==0)
break;
q=q-》next;
}
if(q)
cout《《q-》name《《"_" 《《q-》address《《"_"《《q-》num《《endl;
else cout《《"无此记录"《《endl;
}
void save() //保存用户信息
{
int i;
node *p;
for(i=0;i《20;i++)
{
p=phone-》next;
while(p)
{
fstream iiout("out.txt", ios::out);
iiout《《p-》name《《"_"《《p-》address《《"_"《《p-》num《《endl;
p=p-》next;
}
}
}
void menu() //菜单
{
cout《《"0.添加记录"《《endl;
cout《《"3.查找记录"《《endl;
cout《《"2.姓名散列"《《endl;
cout《《"4.号码散列"《《endl;
cout《《"5.清空记录"《《endl;
cout《《"6.保存记录"《《endl;
cout《《"7.退出系统"《《endl;
}
int main()
{
char num;
char name;
create();
create2() ;
int sel;
while(1)
{
menu();
cin》》sel;
if(sel==3)
{ cout《《"9号码查询,8姓名查询"《《endl;
int b;
cin》》b;
if(b==9)
{ cout《《"请输入电话号码:"《《endl;
cin 》》num;
cout《《"输出查找的信息:"《《endl;
find(num);
}
else
{ cout《《"请输入姓名:"《《endl;
cin 》》name;
cout《《"输出查找的信息:"《《endl;
find2(name);}
}
if(sel==2)
{ cout《《"姓名散列结果:"《《endl;
list2();
}
if(sel==0)
{ cout《《"请输入要添加的内容:"《《endl;
apend();
}
if(sel==4)
{ cout《《"号码散列结果:"《《endl;
list();
}
if(sel==5)
{ cout《《"列表已清空:"《《endl;
create();
create2();
}
if(sel==6)
{ cout《《"通信录已保存:"《《endl;
save();
}
if(sel==7) return 0;
}
return 0;
}

希望大家帮帮我啊!!!C语言 哈希表生成及哈希查找算法 输入:待哈希数据序列 功能要求:输出哈希方法和

你看看这个哈希算法吧、、貌似。,,也差不多咯
#include《stdlib.h》
#include《stdio.h》
#include《malloc.h》
typedef int KeyType;
typedef struct/*元素类型定义*/
{
KeyType key;/*关键字*/
int hi;/*冲突次数*/
}DataType;
typedef struct/*哈希表类型定义*/
{
DataType *data;
int tableSize;/*哈希表的长度*/
int curSize;/*表中关键字个数*/
}HashTable;
void CreateHashTable(HashTable *H,int m,int p,int hash,int n);
int SearchHash(HashTable H,KeyType k);
void DisplayHash(HashTable H,int m);
void HashASL(HashTable H,int m);
void CreateHashTable(HashTable *H,int m,int p,int hash,int n)
/*构造一个空的哈希表,并处理冲突*/
{
int i,sum,addr,di,k=1;
(*H).data=(DataType*)malloc(m*sizeof(DataType));/*为哈希表分配存储空间*/
if(!(*H).data)
exit(-1);
for(i=0;i《m;i++)/*初始化哈希表*/
{
(*H).data.key=-1;
(*H).data.hi=0;
}
for(i=0;i《n;i++)/*求哈希函数地址并处理冲突*/
{
sum=0;/*冲突的次数*/
addr=hash%p;/*利用除留余数法求哈希函数地址*/
di=addr;
if((*H).data.key==-1)/*如果不冲突则将元素存储在表中*/
{
(*H).data;
(*H).data.hi=1;
}
else/*用线性探测再散列法处理冲突*/
{
do
{
di=(di+k)%m;
sum+=1;
} while((*H).data.key!=-1);
(*H).data;
(*H).data.hi=sum+1;
}
}
(*H).curSize=n;/*哈希表中关键字个数为n*/
(*H).tableSize=m;/*哈希表的长度*/
}
int SearchHash(HashTable H,KeyType k)
/*在哈希表H中查找关键字k的元素*/
{
int d,d1,m;
m=H.tableSize;
d=d1=k%m;/*求k的哈希地址*/
while(H.data.key!=-1)
{
if(H.data.key==k)/*如果是要查找的关键字k,则返回k的位置*/
return d;
else/*继续往后查找*/
d=(d+1)%m;
if(d==d1)/*如果查找了哈希表中的所有位置,没有找到返回0*/
return 0;
}
return 0;/*该位置不存在关键字k*/
}
void DisplayHash(HashTable H,int m)
/*输出哈希表*/
{
int i;
printf("哈希表地址:");
for(i=0;i《m;i++)
printf("%-5d",i);
printf("\n");
printf("关键字key: ");
for(i=0;i《m;i++)
printf("%-5d",H.data.key);
printf("\n");
printf("冲突次数: ");
for(i=0;i《m;i++)
printf("%-5d",H.data.hi);
printf("\n");

}
void HashASL(HashTable H,int m)
/*求哈希表的平均查找长度*/
{
float average=0;
int i;
for(i=0;i《m;i++)
average=average+H.data.hi;
average=average/H.curSize;
printf("平均查找长度ASL=%.2f",average);
printf("\n");
}
void main()
{
int hash={23,35,12,56,123,39,342,90};
int m=11,p=11,n=8,pos;
KeyType k;
HashTable H;
CreateHashTable(&H,m,p,hash,n);
DisplayHash(H,m);
k=123;
pos=SearchHash(H,k);
printf("关键字%d在哈希表中的位置为:%d\n",k,pos);
HashASL(H,m);
}

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

#include 《stdio.h》
#include《malloc.h》
#include《string.h》
//#include
#define HASH_LEN 50 //哈希表的长度
#define M 47
#define NAME_NO 30 //人名的个数
typedef struct NAME
{
char *py; //名字的拼音
int k; //拼音所对应的整数
}NAME;
NAME NameList;
typedef struct hterm //哈希表
{
char *py; //名字的拼音
int k; //拼音所对应的整数
int si; //查找长度
}HASH;
HASH HashList;
/*-----------------------姓名(结构体数组)初始化---------------------------------*/
void InitNameList()
{ int i;
char *f;
int r,s0;
NameList.py="chenghongxiu";
NameList.py="yuanhao";
NameList.py="yangyang";
NameList.py="zhanghen";
NameList.py="chenghongxiu";
NameList.py="xiaokai";
NameList.py="liupeng";
NameList.py="shenyonghai";
NameList.py="chengdaoquan";
NameList.py="ludaoqing";
NameList.py="gongyunxiang";
NameList.py="sunzhenxing";
NameList.py="sunrongfei";
NameList.py="sunminglong";
NameList.py="zhanghao";
NameList.py="tianmiao";
NameList.py="yaojianzhong";
NameList.py="yaojianqing";
NameList.py="yaojianhua";
NameList.py="yaohaifeng";
NameList.py="chengyanhao";
NameList.py="yaoqiufeng";
NameList.py="qianpengcheng";
NameList.py="yaohaifeng";
NameList.py="bianyan";
NameList.py="linglei";
NameList.py="fuzhonghui";
NameList.py="huanhaiyan";
NameList.py="liudianqin";
NameList.py="wangbinnian";
for (i=0;i《NAME_NO;i++)// *求出各个姓名的拼音所对应的整数
{
s0=0;
f=NameList.py;

for (r=0;*(f+r) != ’\0’;r++) //方法:将字符串的各个字符所对应的ASCII码相加,所得的整数做为哈希表的关键字
s0=*(f+r)+s0;

NameList.k=s0;
}
}
/*-----------------------建立哈希表---------------------------------*/
void CreateHashList()
{int i;
for ( i=0; i《HASH_LEN;i++)//哈希表的初始化
{
HashList.py="";
HashList.k=0;
HashList.si=0;
}

for (i=0; i《NAME_NO;)
{
int sum=0;
int adr=(NameList.k) % M; //哈希函数
int d=adr;
if(HashList.si==0) //如果不冲突
{
HashList.k;
HashList.py;
HashList.si=1;
}
else //冲突
{
do
{
d=(d+((NameList.k))%10+1)%M; //伪散列
sum=sum+1; //查找次数加1
}while (HashList.k!=0);

HashList.k;
HashList.py;
HashList.si=sum+1;
}i++;
}
}
/*-------------------------------------查找------------------------------------*/
void FindList()
{ int r;
char name={0};
int s0=0;
int sum=1;
int adr;
int d;
printf("\n\n请输入姓名的拼音: "); //输入姓名
scanf("%s",name);

for ( r=0;r《20;r++) //求出姓名的拼音所对应的整数(关键字)
s0+=name;
adr=s0 % M; //使用哈希函数
d=adr;

if(HashList.k==s0) //分3种情况进行判断
printf("\n姓名:%s 关键字:%d 查找长度为: 1",HashList.py,s0);
else if (HashList.k==0)
printf("无该记录!");
else
{
int g=0;
do
{
d=(d+s0%10+1)%M; //伪散列
sum=sum+1;
if (HashList.k==0)
{
printf("无记录! ");
g=1;
}
if (HashList.k==s0)
{
printf("\n姓名:%s 关键字:%d 查找长度为:%d",HashList.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; i《15; i++)
{
printf("%d ",i);
printf("\t%d ",HashList.k);
printf("\t\t%d ",HashList.si);
printf("\t\t%d ",(HashList.k)%M);
printf("\t %s ",HashList.py);
printf("\n");
}
// printf("按任意键继续显示...\n"); //由于数据比较多,所以分屏显示(以便在Win9x/DOS下能看到所有的数据)
// getch();
for( i=15; i《30; i++)
{
printf("%d ",i);
printf("\t%d ",HashList.k);
printf("\t\t%d ",HashList.si);
printf("\t\t%d ",(HashList.k)%M);
printf("\t %s ",HashList.py);
printf("\n");
}
// printf("按任意键继续显示...\n");
// getch();
for( i=30; i《40; i++)
{
printf("%d ",i);
printf("\t%d ",HashList.k);
printf("\t\t%d ",HashList.si);
printf("\t\t%d ",(HashList.k)%M);
printf("\t %s ",HashList.py);
printf("\n");
}
//printf("按任意键继续显示...\n");
//getch();
for( i=40; i《50; i++)
{
printf("%d ",i);
printf("\t%d ",HashList.k);
printf("\t\t%d ",HashList.si);
printf("\t\t%d ",(HashList.k)%M);
printf("\t %s ",HashList.py);
printf("\n");
}
for (i=0;i《HASH_LEN;i++)
{average+=HashList.si;
average/=NAME_NO;
printf("\n\n平均查找长度:ASL(%d)=%f \n\n",NAME_NO,average);
}
}
/*--------------------------------主函数----------------------------*/
void main()
{
/* ::SetC***oleTitle("哈希表操作"); //Windows API函数,设置控制台窗口的标题
HANDLE hCon = ::GetStdHandle(STD_OUTPUT_HANDLE); //获得标准输出设备的句柄
::SetC***oleTextAttribute(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;
}
}
}

针对自己的班集体中的“人名”设计一个哈希表,使得平均查找长度不超过R,完成相应的建表和查表程序

int i;
float average=0;

cout《《"\n地址\t关键字\t\t搜索长度\tH(key)\t 姓名\n"; //显示的格式
for(i=0; i《50; i++)
{
cout《《i《《" ";
cout《《"\t"《《HashList.k《《" ";
cout《《"\t\t"《《HashList.si《《" ";
cout《《"\t\t"《《(HashList.k%M)《《" ";
cout《《"\t "《《HashList.py《《" ";
cout《《"\n";
}
for(i=0;i《HASH_LENGTH;i++)
average+=HashList.si;
average/=NAME_NO;
cout《《"平均查找长度:ASL("《《NAME_NO《《")="《《average《《endl;
}
int main()
{
char x;
InitNameList();
CreateHashList ();
求采纳为满意回答。

C语言高手来看看

首先我是没看程序~只是看了你说的情况~,如果是可以运行的那就是格式是没有错的~结果不对~那你就要检查一下主要部分的算法的问题~了~你自己检查一下吧~

c语言hash函数有几种

#include 《stdio.h》#include 《stdlib.h》//这里我自己设计一个hash算法来快速查找一堆数字中相等的数字,这也许是最接近原理的算法了//一个整数整除27后的来作为hash函数//定义一个保存实际数据的结构体节点struct data_node{    int num;    int count;    struct data_node *next;};//定义一个结构体时hash表的一部分typedef struct{    int key; //余数    struct data_node *p; //链表的头指针} hash_node;#define HASH_SIZE 27int do_hash(int num) //hash表来求余数,这样就可以了{    return num%HASH_SIZE;}//初始化//添加数字//更新数字//删除数字//查找数字hash_node HashTable; //这里申明一个hashtable的数组//初始化函数,需要做的事将key复制为null,将p指针指向null,返回一个头指针来指向这个hashtablevoid InitHashTable(hash_node *HashTable)
{    //进行参数的校验    for(int i=0;i《HASH_SIZE;i++)
    {
        HashTable.p =NULL;    }
}//保存到这个链表中//如果这个链表是空的话,就作为头指针,如果这个链表不为空,则添加到吧数字添加到末尾int savedata(struct data_node **head,int num)
{    struct data_node *tmp_p = *head;    struct data_node *p = (struct data_node *)malloc(sizeof(struct data_node));    if(p == NULL)        return 0;    if(*head == NULL)
    {
        *head = p;        p-》count = 1;        p-》num = num;        p-》next = NULL;    }    else //如果不为空,则这个时候应该添加到链表末尾    {        while(tmp_p != NULL)//如果存在,则将这个节点的count加1就可以了        {            if(tmp_p-》num == num)
            {
                ****(p);                ++tmp_p-》count ;                return 0;            }            if(tmp_p-》next == NULL)                break;            tmp_p = tmp_p-》next;        }
        tmp_p-》next = p;        p-》count =1;        p-》num = num;        p-》next = NULL;    }    return 0;}//添加数字//将这个数字经过hash求出结果,然后再保存到相应的链表中//返回真或者假就可以了int add_hash(hash_node *HashTable,int num)
{    int mod = do_hash(num);    return savedata(&HashTable.p,num);}int main()
{    int num = 100;    hash_node *H = HashTable;    InitHashTable(H);    add_hash(H,num);    add_hash(H,num);    add_hash(H,3);    add_hash(H,1);    add_hash(H,4);    //在这里我们可以发现一个好的hash函数是多么的重要,如果hash函数不好造成很多冲突的话,效率并不会提高很多的,理想的情况是冲突几乎没有    //这也就是设计hash函数的精髓所在    return 0;}

随着发展,C语言哈希表哈希表c语言中的地位愈发凸显。提前理解它,就是提前布局未来。
本文编辑:admin

更多文章:


keras api(keras和卷积神经网络关系)

keras api(keras和卷积神经网络关系)

keras api的背后,隐藏着怎样的秘密?keras和卷积神经网络关系又在其中扮演了何种角色?带着疑问,我们一起探秘。

2026年4月19日 01:20

jsoup下载图片(java android jsoup怎么安装)

jsoup下载图片(java android jsoup怎么安装)

您是否曾想过,jsoup下载图片究竟是怎么一回事?它与java android jsoup怎么安装之间又有什么联系?本文将为您一探究竟。

2026年4月19日 01:00

mysql启动一闪而过(mysql闪退怎么解决)

mysql启动一闪而过(mysql闪退怎么解决)

为什么说不懂mysql闪退怎么解决,就等于没学明白mysql启动一闪而过?这篇文章将给你一个令人信服的解释。

2026年4月19日 00:40

originos系统最新版本(怎么看originos是2.0还是3.0)

originos系统最新版本(怎么看originos是2.0还是3.0)

大家好,originos系统最新版本相信很多的网友都不是很明白,包括怎么看originos是2.0还是3.0也是一样,不过没有关系,接下来就来为大家分享关于originos系统最新版本和怎么看originos是2.0还是3.0的一些知识点,

2026年4月19日 00:20

execl换行(excel表格怎么换行)

execl换行(excel表格怎么换行)

execl换行的背后,隐藏着怎样的秘密?excel表格怎么换行又在其中扮演了何种角色?带着疑问,我们一起探秘。

2026年4月19日 00:00

哈希表c语言(C语言哈希表)

哈希表c语言(C语言哈希表)

关于哈希表c语言,您需要知道的几个关键点,尤其是C语言哈希表的深入解析,我们都将在这篇文章中涵盖。

2026年4月18日 23:40

div是什么意思 物理(流体力学中div什么意思)

div是什么意思 物理(流体力学中div什么意思)

大家好,如果您还对div是什么意思 物理不太了解,没有关系,今天就由本站为大家分享div是什么意思 物理的知识,包括流体力学中div什么意思的问题都会给大家分析到,还望可以解决大家的问题,下面我们就开始吧!

2026年4月18日 23:20

wrap search(关于巴朗字典的问题)

wrap search(关于巴朗字典的问题)

还记得第一次接触wrap search时的茫然吗?是关于巴朗字典的问题这个概念,像一盏灯照亮了后续的路。本文将为你点亮这盏灯。

2026年4月18日 23:00

防火墙阻止web访问(web防火墙怎么关闭)

防火墙阻止web访问(web防火墙怎么关闭)

其实防火墙阻止web访问的问题并不复杂,但是又很多的朋友都不太了解web防火墙怎么关闭,因此呢,今天小编就来为大家分享防火墙阻止web访问的一些知识,希望可以帮助到大家,下面我们一起来看看这个问题的分析吧!

2026年4月18日 22:40

网页设计与制作教程目录(网页设计教程的目录)

网页设计与制作教程目录(网页设计教程的目录)

常言道:“万丈高楼平地起”。理解网页设计与制作教程目录这座大厦,也必须从网页设计教程的目录这块基石开始。

2026年4月18日 22:20

最近更新

keras api(keras和卷积神经网络关系)
2026-04-19 01:20:02 浏览:0
jsoup下载图片(java android jsoup怎么安装)
2026-04-19 01:00:01 浏览:0
execl换行(excel表格怎么换行)
2026-04-19 00:00:03 浏览:0
哈希表c语言(C语言哈希表)
2026-04-18 23:40:02 浏览:0
wrap search(关于巴朗字典的问题)
2026-04-18 23:00:03 浏览:0
热门文章

win10安装silverlight(silverlight安装失败)
2026-04-02 12:40:01 浏览:0
layernorm pytorch(batch norm和layer norm)
2026-04-01 23:20:02 浏览:0
cmd grep命令(如何在Command Line 命令中使用Grep)
2026-04-01 15:20:02 浏览:0
floatleft是什么意思(displayflex和floatleft的区别)
2026-04-17 04:40:03 浏览:0
标签列表