c语言哈希字典,c语言实现哈希

本文目录一览:

C语言实现哈希表的相关运算算法 编写程序实现哈希表的构造过程。

#define MaxSize 100 //定义最大哈希表长度

#define NULLKEY -1 //定义空关键字值

#define DELKEY -2 //定义被删关键字值

typedef int KeyType; //关键字类型

typedef char * InfoType; //其他数据类型

typedef struct

{

KeyType key; //关键字域

InfoType data; //其他数据域

int count; //探查次数域

} HashData;

typedef HashData HashTable[MaxSize]; //哈希表类型

void InsertHT(HashTable ha,int n,KeyType k,int p) //将关键字k插入到哈希表中

{

int i,adr;

adr=k % p;

if (ha[adr].key==NULLKEY || ha[adr].key==DELKEY) //x[j]可以直接放在哈希表中

{

ha[adr].key=k;

ha[adr].count=1;

}

else //发生冲突时采用线性探查法解决冲突

{

i=1; //i记录x[j]发生冲突的次数

do

{

adr=(adr+1) % p;

i++;

}

while (ha[adr].key!=NULLKEY ha[adr].key!=DELKEY);

ha[adr].key=k;

ha[adr].count=i;

}

n++;

}

void CreateHT(HashTable ha,KeyType x[],int n,

C语言中的hash函数

Hash,一般翻译做”散列”,也有直接音译为”哈希”的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,而不可能从散列值来唯一的确定输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。

HASH主要用于信息安全领域中加密算法,它把一些不同长度的信息转化成杂乱的128位的编码里,叫做HASH值. 也可以说,hash就是找到一种数据内容和数据存放地址之间的映射关系。Hash算法在信息安全方面的应用主要体现在以下的3个方面:文件校验、数字签名、鉴权协议

程程序实现

// 说明:Hash函数(即散列函数)在程序设计中的应用目标 —— 把一个对象通过某种转换机制对应到一个

//size_t类型(即unsigned long)的整型值。

// 而应用Hash函数的领域主要是 hash表(应用非常广)、密码等领域。

// 实现说明:

// ⑴、这里使用了函数对象以及泛型技术,使得对所有类型的对象(关键字)都适用。

// ⑵、常用类型有对应的偏特化,比如string、char*、各种整形等。

// ⑶、版本可扩展,如果你对某种类型有特殊的需要,可以在后面实现专门化。

// ⑷、以下实现一般放在头文件中,任何包含它的都可使用hash函数对象。

//————————————实现————————————————

#include string

using std::string;

inlinesize_thash_str(const char* s)

{

unsigned long res = 0;

for (; *s; ++s)

res = 5 * res + *s;

returnsize_t(res);

}

template class Key

struct hash

{

size_toperator () (const Key k) const;

};

// 一般的对象,比如:vector queuestring ;的对象,需要强制转化

template class Key

size_thashKey::operator () (const Key k) const

{

size_tres = 0;

size_tlen = sizeof(Key);

const char* p = reinterpret_castconst char*(k);

while (len–)

{

res = (res1)^*p++;

}

return res;

}

// 偏特化

template

size_thash string ::operator () (const string str) const

{

return hash_str(str.c_str());

}

typedef char* PChar;

template

size_thashPChar::operator () (const PChar s) const

{

return hash_str(s);

}

typedef const char* PCChar;

template

size_thashPCChar::operator () (const PCChar s) const

{

return hash_str(s);

}

template size_t hashchar::operator () (const char x) const { return x; }

template size_t hashunsigned char::operator () (const unsigned char x) const { return x; }

template size_t hashsigned char::operator () (const signed char x) const { return x; }

template size_t hashshort::operator () (const short x) const { return x; }

template size_t hashunsigned short::operator () (const unsigned short x) const { return x; }

template size_t hashint::operator () (const int x) const { return x; }

template size_t hashunsigned int::operator () (const unsigned int x) const { return x; }

template size_t hashlong::operator () (const long x) const { return x; }

template size_t hashunsigned long::operator () (const unsigned long x) const { return x; }

// 使用说明:

//

// ⑴、使用时首先由于是泛型,所以要加上关键字类型。

//

// ⑵、其次要有一个函数对象,可以临时、局部、全局的,只要在作用域就可以。

//

// ⑶、应用函数对象作用于对应类型的对象。

//———————– hash函数使用举例 ————————-

#include iostream

#include vector

#include string

using namespace std;

int main()

{

vectorstring vstr⑵;

vstr[0] = “sjw”;

vstr[1] = “suninf”;

hashstring strhash; // 局部函数对象

cout ” Hash value: ” strhash(vstr[0]) endl;

cout ” Hash value: ” strhash(vstr[1]) endl;

cout ” Hash value: ” hash vectorstring () (vstr) endl;

cout ” Hash value: ” hashint() (100) endl; // hashint() 临时函数对象

return 0;

}

这段C语言代码如何转换成Python语言?(关于哈希表)

def search_hash1(H, c):

str = input(“\n请输入要查找记录的姓名:\n”)

p = hash1(str)

pp = p

while H[pp] is not None and eq(str, H[pp].name) == -1:

pp = collision(p, c)

if H[pp] is not None and eq(str, H[pp].name) == 1:

print(f”\n查找成功!\n查找过程冲突次数为{c}.以下是您需要要查找的信息:\n\n姓名:{H[pp].name}\n学号:{H[pp].xuehao}\n电话号码:{H[pp].tel}”)

else:

print(“\n此人不存在,查找不成功!”)

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[8],address[20];

char num[11];

node * next;

};

typedef node* pnode;

typedef node* mingzi;

node **phone;

node **nam;

node *a;

using namespace std; //使用名称空间

void hash(char num[11]) //哈希函数

{

int i = 3;

key=(int)num[2];

while(num[i]!=NULL)

{

key+=(int)num[i];

i++;

}

key=key%20;

}

void hash2(char name[8]) //哈希函数

{

int i = 1;

key2=(int)name[0];

while(name[i]!=NULL)

{

key2+=(int)name[i];

i++;

}

key2=key2%20;

}

node* input() //输入节点

{

node *temp;

temp = new node;

temp-next=NULL;

cout”输入姓名:”endl;

cintemp-name;

cout”输入地址:”endl;

cintemp-address;

cout”输入电话:”endl;

cintemp-num;

return temp;

}

int apend() //添加节点

{

node *newphone;

node *newname;

newphone=input();

newname=newphone;

newphone-next=NULL;

newname-next=NULL;

hash(newphone-num);

hash2(newname-name);

newphone-next = phone[key]-next;

phone[key]-next=newphone;

newname-next = nam[key2]-next;

nam[key2]-next=newname;

return 0;

}

void create() //新建节点

{

int i;

phone=new pnode[20];

for(i=0;i20;i++)

{

phone[i]=new node;

phone[i]-next=NULL;

}

}

void create2() //新建节点

{

int i;

nam=new mingzi[20];

for(i=0;i20;i++)

{

nam[i]=new node;

nam[i]-next=NULL;

}

}

void list() //显示列表

{

int i;

node *p;

for(i=0;i20;i++)

{

p=phone[i]-next;

while(p)

{

coutp-name’_’p-address’_’p-numendl;

p=p-next;

}

}

}

void list2() //显示列表

{

int i;

node *p;

for(i=0;i20;i++)

{

p=nam[i]-next;

while(p)

{

coutp-name’_’p-address’_’p-numendl;

p=p-next;

}

}

}

void find(char num[11]) //查找用户信息

{

hash(num);

node *q=phone[key]-next;

while(q!= NULL)

{

if(strcmp(num,q-num)==0)

break;

q=q-next;

}

if(q)

coutq-name”_” q-address”_”q-numendl;

else cout”无此记录”endl;

}

void find2(char name[8]) //查找用户信息

{

hash2(name);

node *q=nam[key2]-next;

while(q!= NULL)

{

if(strcmp(name,q-name)==0)

break;

q=q-next;

}

if(q)

coutq-name”_” q-address”_”q-numendl;

else cout”无此记录”endl;

}

void save() //保存用户信息

{

int i;

node *p;

for(i=0;i20;i++)

{

p=phone[i]-next;

while(p)

{

fstream iiout(“out.txt”, ios::out);

iioutp-name”_”p-address”_”p-numendl;

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[11];

char name[8];

create();

create2() ;

int sel;

while(1)

{

menu();

cinsel;

if(sel==3)

{ cout”9号码查询,8姓名查询”endl;

int b;

cinb;

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;

}

原创文章,作者:NRPX,如若转载,请注明出处:https://www.506064.com/n/132830.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
NRPXNRPX
上一篇 2024-10-03 23:54
下一篇 2024-10-03 23:54

相关推荐

  • Python字典去重复工具

    使用Python语言编写字典去重复工具,可帮助用户快速去重复。 一、字典去重复工具的需求 在使用Python编写程序时,我们经常需要处理数据文件,其中包含了大量的重复数据。为了方便…

    编程 2025-04-29
  • AES加密解密算法的C语言实现

    AES(Advanced Encryption Standard)是一种对称加密算法,可用于对数据进行加密和解密。在本篇文章中,我们将介绍C语言中如何实现AES算法,并对实现过程进…

    编程 2025-04-29
  • 学习Python对学习C语言有帮助吗?

    Python和C语言是两种非常受欢迎的编程语言,在程序开发中都扮演着非常重要的角色。那么,学习Python对学习C语言有帮助吗?答案是肯定的。在本文中,我们将从多个角度探讨Pyth…

    编程 2025-04-29
  • Python被称为胶水语言

    Python作为一种跨平台的解释性高级语言,最大的特点是被称为”胶水语言”。 一、简单易学 Python的语法简单易学,更加人性化,这使得它成为了初学者的入…

    编程 2025-04-29
  • Python中取出字典中对应键的值

    如何使用Python在字典中获取特定键的值?这是Python编程中必须掌握的技能之一。本文将通过多个方面来详细讲解Python如何取出字典中对应键的值。 一、通过键名获取值 当我们…

    编程 2025-04-29
  • Python如何遍历字典中的key和value

    本文将详细讲解Python中如何遍历字典中的key和value,包括多种遍历方式以及在遍历过程中的一些应用场景。 一、遍历字典中的key和value 在Python中,字典是一种无…

    编程 2025-04-29
  • OpenJudge答案1.6的C语言实现

    本文将从多个方面详细阐述OpenJudge答案1.6在C语言中的实现方法,帮助初学者更好地学习和理解。 一、需求概述 OpenJudge答案1.6的要求是,输入两个整数a和b,输出…

    编程 2025-04-29
  • Python按位运算符和C语言

    本文将从多个方面详细阐述Python按位运算符和C语言的相关内容,并给出相应的代码示例。 一、概述 Python是一种动态的、面向对象的编程语言,其按位运算符是用于按位操作的运算符…

    编程 2025-04-29
  • Python语言由荷兰人为中心的全能编程开发工程师

    Python语言是一种高级语言,很多编程开发工程师都喜欢使用Python语言进行开发。Python语言的创始人是荷兰人Guido van Rossum,他在1989年圣诞节期间开始…

    编程 2025-04-28
  • Python字典列表去重

    这篇文章将介绍如何使用Python对字典列表进行去重操作,并且从多个方面进行详细的阐述。 一、基本操作 首先我们需要了解Python字典列表去重的基本操作。Python中提供了一种…

    编程 2025-04-28

发表回复

登录后才能评论