哈希查找算法的源代码 c语言
c语言哈希库函数

c语言哈希库函数一、概述哈希表是一种常见的数据结构,用于实现键值对的快速查找。
C语言中没有内置的哈希表库,但可以通过编写自己的哈希库函数来实现相同的功能。
本文将介绍如何编写一个基本的哈希库函数。
二、哈希函数哈希函数是将键映射到索引的算法。
它应该满足以下要求:1. 对于相同的键,始终返回相同的索引。
2. 对于不同的键,尽可能返回不同的索引。
3. 将键均匀地分布在索引范围内。
常用的哈希函数包括除留余数法、乘法散列法和SHA等。
下面是一个简单的除留余数法哈希函数:```unsigned int hash(char *key, int size) {unsigned int hashval = 0;for (int i = 0; key[i] != '\0'; i++) {hashval = key[i] + 31 * hashval;}return hashval % size;}```该函数将每个字符转换为ASCII码并加权求和,然后使用除留余数法将结果映射到索引范围内。
三、数据结构为了实现哈希表,我们需要定义一个包含以下成员变量的结构体:```typedef struct {char *key;void *value;} HashNode;typedef struct {int size;int count;HashNode **nodes;} HashTable;```其中,HashNode表示哈希表中的一个键值对,key为键,value为值。
HashTable包含三个成员变量:1. size:哈希表的大小。
2. count:哈希表中键值对的数量。
3. nodes:指向HashNode指针数组的指针。
四、初始化函数在使用哈希表之前,需要先创建一个空的HashTable对象。
下面是一个简单的初始化函数:```HashTable *hash_init(int size) {HashTable *table = malloc(sizeof(HashTable));table->size = size;table->count = 0;table->nodes = calloc(size, sizeof(HashNode *));return table;}```该函数分配内存并将成员变量初始化为初始值。
c++字符串哈希计算

在C++中,计算字符串的哈希值通常涉及到使用某种哈希函数。
哈希函数将输入(在这种情况下是字符串)转换为固定大小的输出,通常是整数。
这个输出被称为哈希值或哈希码。
在C++标准库中,没有内置的字符串哈希函数,但你可以使用第三方库,如Boost,或者自己实现一个简单的哈希函数。
另外,C++11引入了std::hash模板类,它可以用于获取标准类型的哈希值,包括std::string。
下面是一个使用std::hash来计算字符串哈希值的例子:cpp#include <iostream>#include <string>#include <functional>int main() {std::string str = "Hello, World!";std::hash<std::string> hasher;size_t hash = hasher(str);std::cout << "Hash value of \"" << str << "\" is: " << hash << std::endl; return 0;}在这个例子中,我们使用了std::hash<std::string>来创建一个字符串哈希函数对象。
然后,我们通过调用这个函数对象并传入我们的字符串来计算哈希值。
最后,我们打印出计算得到的哈希值。
请注意,不同的编译器和平台可能会产生不同的哈希值,因为C++标准并没有规定std::hash 的具体实现。
因此,如果你需要跨平台的一致性,你可能需要使用一个特定的哈希算法,如MD5、SHA-1或SHA-256,这些都可以通过第三方库(如OpenSSL或Crypto++)来实现。
然而,这些算法通常用于密码学和数据完整性检查,而不是普通的哈希表查找。
c语言开源hash项目——uthash

c语言开源 hash项目 ——uthash
1 //------------------------------------------
2 // c语言 开源hash项目 —— uthash
3 //
4 //
5 //eg: 对 字符串进行查找和删除 字符指针
6 //
7 // warning: uthash 对 字符指针和字符数组,
8 //
插入的函数是不一样的,查找的函数是一致的
9 //
对所有的类型,删除的操作
10 //-------------------------------------------
21 UT_hash_handle hh;
22 }uthash_int;
23
24 // 查找
25 uthash_int *find_uthash_int(uthash_int *g_users, int ikey)
26 {
27 uthash_int *s = NULL;
28 HASH_FIND_INT(g_users, &ikey, s);
11
12 #include "gtest/gtest.h"
13 #include <iostream>
14 using namespace std;
15
16 #include"uthash/uthash.h"
17
18 typedef struct {
常用Hash算法(C语言的简单实现)

常⽤Hash算法(C语⾔的简单实现)如下所⽰:#include "GeneralHashFunctions.h"unsigned int RSHash(char* str, unsigned int len){unsigned int b = 378551;unsigned int a = 63689;unsigned int hash = 0;unsigned int i = 0;for(i = 0; i < len; str++, i++){hash = hash * a + (*str);a = a * b;}return hash;}/* End Of RS Hash Function */unsigned int JSHash(char* str, unsigned int len){unsigned int hash = 1315423911;unsigned int i = 0;for(i = 0; i < len; str++, i++){hash ^= ((hash << 5) + (*str) + (hash >> 2));}return hash;}/* End Of JS Hash Function */unsigned int PJWHash(char* str, unsigned int len){const unsigned int BitsInUnsignedInt = (unsigned int)(sizeof(unsigned int) * 8);const unsigned int ThreeQuarters = (unsigned int)((BitsInUnsignedInt * 3) / 4);const unsigned int OneEighth = (unsigned int)(BitsInUnsignedInt / 8);const unsigned int HighBits = (unsigned int)(0xFFFFFFFF) << (BitsInUnsignedInt - OneEighth);unsigned int hash = 0;unsigned int test = 0;unsigned int i = 0;for(i = 0; i < len; str++, i++){hash = (hash << OneEighth) + (*str);if((test = hash & HighBits) != 0){hash = (( hash ^ (test >> ThreeQuarters)) & (~HighBits));}}return hash;}/* End Of P. J. Weinberger Hash Function */unsigned int ELFHash(char* str, unsigned int len){unsigned int hash = 0;unsigned int x = 0;unsigned int i = 0;for(i = 0; i < len; str++, i++){hash = (hash << 4) + (*str);if((x = hash & 0xF0000000L) != 0){hash ^= (x >> 24);}hash &= ~x;}return hash;}/* End Of ELF Hash Function */unsigned int BKDRHash(char* str, unsigned int len){unsigned int seed = 131; /* 31 131 1313 13131 131313 etc.. */ unsigned int hash = 0;unsigned int i = 0;for(i = 0; i < len; str++, i++){hash = (hash * seed) + (*str);}return hash;}/* End Of BKDR Hash Function */unsigned int SDBMHash(char* str, unsigned int len){unsigned int hash = 0;unsigned int i = 0;for(i = 0; i < len; str++, i++){hash = (*str) + (hash << 6) + (hash << 16) - hash;}return hash;}/* End Of SDBM Hash Function */unsigned int DJBHash(char* str, unsigned int len){unsigned int hash = 5381;unsigned int i = 0;for(i = 0; i < len; str++, i++){hash = ((hash << 5) + hash) + (*str);}return hash;}/* End Of DJB Hash Function */unsigned int DEKHash(char* str, unsigned int len){unsigned int hash = len;unsigned int i = 0;for(i = 0; i < len; str++, i++){hash = ((hash << 5) ^ (hash >> 27)) ^ (*str);}return hash;}/* End Of DEK Hash Function */unsigned int BPHash(char* str, unsigned int len){unsigned int hash = 0;unsigned int i = 0;for(i = 0; i < len; str++, i++){hash = hash << 7 ^ (*str);}return hash;}/* End Of BP Hash Function */unsigned int FNVHash(char* str, unsigned int len){const unsigned int fnv_prime = 0x811C9DC5;unsigned int hash = 0;unsigned int i = 0;for(i = 0; i < len; str++, i++){hash *= fnv_prime;hash ^= (*str);}return hash;}/* End Of FNV Hash Function */unsigned int APHash(char* str, unsigned int len){unsigned int hash = 0xAAAAAAAA;unsigned int i = 0;for(i = 0; i < len; str++, i++){hash ^= ((i & 1) == 0) ? ( (hash << 7) ^ (*str) * (hash >> 3)) :(~((hash << 11) + ((*str) ^ (hash >> 5))));}return hash;}/* End Of AP Hash Function */以上就是⼩编为⼤家带来的常⽤Hash算法(C语⾔的简单实现)的全部内容了,希望对⼤家有所帮助,多多⽀持~。
C语言中的搜索算法详解

C语言中的搜索算法详解搜索算法在计算机科学中起着重要的作用,它们可以帮助我们在大量数据中迅速找到目标元素。
在C语言中,有多种搜索算法可供选择。
本文将深入探讨一些常用的搜索算法,包括线性搜索、二分搜索和哈希表搜索。
一、线性搜索线性搜索是最简单的搜索算法之一,也被称为顺序搜索。
它逐个比较列表中的元素,直到找到目标元素或搜索完整个列表。
这种算法适用于无序列表,并且其时间复杂度为O(n),其中n为列表的长度。
在C语言中,我们可以使用for循环来实现线性搜索算法。
下面是一个示例代码:```c#include <stdio.h>int linear_search(int arr[], int n, int target) {for(int i = 0; i < n; i++) {if(arr[i] == target) {return i;}}return -1;}int main() {int arr[] = {1, 2, 3, 4, 5};int n = sizeof(arr) / sizeof(arr[0]);int target = 3;int result = linear_search(arr, n, target);if(result != -1) {printf("目标元素在列表中的索引为:%d\n", result);} else {printf("目标元素不在列表中。
\n");}return 0;}```二、二分搜索二分搜索是一种更有效的搜索算法,前提是列表已经按照升序或降序排列。
它通过将目标元素与列表的中间元素进行比较,并根据比较结果将搜索范围缩小一半。
这种算法的时间复杂度为O(logn),其中n 为列表的长度。
在C语言中,我们可以使用递归或迭代的方式实现二分搜索算法。
下面是一个使用迭代方式实现的示例代码:```c#include <stdio.h>int binary_search(int arr[], int low, int high, int target) {while(low <= high) {int mid = (low + high) / 2;if(arr[mid] == target) {return mid;} else if(arr[mid] < target) {low = mid + 1;} else {high = mid - 1;}}return -1;}int main() {int arr[] = {1, 2, 3, 4, 5};int n = sizeof(arr) / sizeof(arr[0]);int target = 3;int result = binary_search(arr, 0, n - 1, target);if(result != -1) {printf("目标元素在列表中的索引为:%d\n", result);} else {printf("目标元素不在列表中。
SHA1算法源代码

SHA1算法源代码SHA-1(Secure Hash Algorithm 1)是一种常见的哈希算法,用于生成哈希值,常用于密码学和安全领域。
下面是SHA-1算法的详细源代码:```pythonimport struct#初始化常数h1=0xEFCDAB89h2=0x98BADCFEh4=0xC3D2E1F0def sha1(message):"""输入:字符串message输出:字符串的SHA-1哈希值"""#补位original_length = len(message) * 8message += b'\x80'while (len(message) + 8) % 64 != 0:message += b'\x00'message += struct.pack('>Q', original_length)#分组blocks = []for i in range(0, len(message), 64):block = message[i:i+64]blocks.append(block)#处理每个分组for block in blocks:w = list(struct.unpack('>16I', block))#扩展消息for i in range(16, 80):w.append(left_rotate((w[i-3] ^ w[i-8] ^ w[i-14] ^ w[i-16]), 1))#初始化哈希值a=h0b=h1c=h2d=h3e=h4#执行80轮循环for i in range(0, 80):if 0 <= i < 20:f=(b&c),((~b)&d)elif 20 <= i < 40:f=b^c^dk=0x6ED9EBA1elif 40 <= i < 60:f=(b&c),(b&d),(c&d)k=0x8F1BBCDCelse:f=b^c^dk=0xCA62C1D6temp = (left_rotate(a, 5) + f + e + k + w[i]) & 0xffffffff e=dd=cc = left_rotate(b, 30)b=aa = temp#更新哈希值h0 = (h0 + a) & 0xffffffffh1 = (h1 + b) & 0xffffffffh2 = (h2 + c) & 0xffffffffh3 = (h3 + d) & 0xffffffffh4 = (h4 + e) & 0xffffffff#输出哈希值digest = struct.pack('>5I', h0, h1, h2, h3, h4)return digest.hexdef left_rotate(n, b):"""左旋转n"""return ((n << b) , (n >> (32 - b))) & 0xffffffff```上面的代码实现了SHA-1算法的核心部分。
hashCode--C++源码

intptr_t ObjectSynchronizer::FastHashCode (Thread * Self, oop obj) {if (UseBiasedLocking) {// NOTE: many places throughout the JVM do not expect a safepoint// to be taken here, in particular most operations on perm gen// objects. However, we only ever bias Java instances and all of// the call sites of identity_hash that might revoke biases have// been checked to make sure they can handle a safepoint. The// added check of the bias pattern is to avoid useless calls to// thread-local storage.if (obj->;mark()->;has_bias_pattern()) {// Box and unbox the raw reference just in case we cause a STW safepoint. Handle hobj (Self, obj) ;// Relaxing assertion for bug 6320749.assert (Universe::verify_in_progress() ||!SafepointSynchronize::is_at_safepoint(),";biases should not be seen by VM thread here";);BiasedLocking::revoke_and_rebias(hobj, false, JavaThread::current()); obj = hobj() ;assert(!obj->;mark()->;has_bias_pattern(), ";biases should be revoked by now";);}}// hashCode() is a heap mutator ...// Relaxing assertion for bug 6320749.assert (Universe::verify_in_progress() ||!SafepointSynchronize::is_at_safepoint(), ";invariant";) ;assert (Universe::verify_in_progress() ||Self->;is_Java_thread() , ";invariant";) ;assert (Universe::verify_in_progress() ||((JavaThread *)Self)->;thread_state() != _thread_blocked, ";invariant";) ;ObjectMonitor* monitor = NULL;markOop temp, test;intptr_t hash;markOop mark = ReadStableMark (obj);// object should remain ineligible for biased lockingassert (!mark->;has_bias_pattern(), ";invariant";) ;if (mark->;is_neutral()) {hash = mark->;hash(); // this is a normal headerif (hash) { // if it has hash, just returnreturn hash;}hash = get_next_hash(Self, obj); // allocate a new hash codetemp = mark->;copy_set_hash(hash); // merge the hash code into header// use (machine word version) atomic operation to install the hashtest = (markOop) Atomic::cmpxchg_ptr(temp, obj->;mark_addr(), mark);if (test == mark) {return hash;}// If atomic operation failed, we must inflate the header// into heavy weight monitor. We could add more code here// for fast path, but it does not worth the complexity.} else if (mark->;has_monitor()) {monitor = mark->;monitor();temp = monitor->;header();assert (temp->;is_neutral(), ";invariant";) ;hash = temp->;hash();if (hash) {return hash;}// Skip to the following code to reduce code size} else if (Self->;is_lock_owned((address)mark->;locker())) {temp = mark->;displaced_mark_helper(); // this is a lightweight monitor owned assert (temp->;is_neutral(), ";invariant";) ;hash = temp->;hash(); // by current thread, check if the displacedif (hash) { // header contains hash code return hash;}// WARNING:// The displaced header is strictly immutable.// It can NOT be changed in ANY cases. So we have// to inflate the header into heavyweight monitor// even the current thread owns the lock. The reason// is the BasicLock (stack slot) will be asynchronously// read by other threads during the inflate() function.// Any change to stack may not propagate to other threads// correctly.}// Inflate the monitor to set hash codemonitor = ObjectSynchronizer::inflate(Self, obj);// Load displaced header and check it has hash codemark = monitor->;header();assert (mark->;is_neutral(), ";invariant";) ;hash = mark->;hash();if (hash == 0) {hash = get_next_hash(Self, obj);temp = mark->;copy_set_hash(hash); // merge hash code into headerassert (temp->;is_neutral(), ";invariant";) ;test = (markOop) Atomic::cmpxchg_ptr(temp, monitor, mark);if (test != mark) {// The only update to the header in the monitor (outside GC)// is install the hash code. If someone add new usage of// displaced header, please update this codehash = test->;hash();assert (test->;is_neutral(), ";invariant";) ;assert (hash != 0, ";Trivial unexpected object/monitor header usage.";); }}// We finally get the hashreturn hash;}。
c语言自带的hash函数

c语言自带的hash函数C语言自带的哈希函数指的是stdlib库中提供的哈希算法函数。
在C语言中,stdlib库是一个通用的标准库,提供了一系列常用的函数,其中包括很多常用的哈希算法函数。
在实际编程中,使用stdlib库中的哈希函数可以方便快捷地完成各种哈希操作。
具体来说,stdlib库中提供了两个常用的哈希函数,分别是:1. hash()2. hcreate()其中,hash()函数用于计算给定键值的哈希值,而hcreate()函数用于创建一个哈希表。
下面将逐一介绍这两个函数的详细用法和作用。
1. hash()函数hash()函数是stdlib库中提供的一个常用的哈希算法函数,用于计算给定键值的哈希值。
该函数可以用于任何数据结构的哈希表中,包括数组、字符串、结构体等等。
hash()函数的定义如下:unsigned hash(const void *key, size_t length)其中,key为输入的键值,length为键值的长度。
该函数的返回值为一个unsigned整数,表示计算出来的哈希值。
在使用hash()函数时,需要注意以下几点:(1)键值必须以一个void类型的指针的形式传递给hash()函数,并使用length 指定键值的长度。
(2)哈希值的计算结果是一个无符号整数,其取值范围为[0, 4294967295]。
(3)hash()函数使用了一个简单的算法来计算哈希值。
该算法会按位操作键值,并使用数学运算将位运算结果组合成一个哈希值。
2. hcreate()函数hcreate()函数是stdlib库中提供的一个用于创建哈希表的函数。
该函数可以用于创建任何种类的哈希表,包括使用链表或数组实现的哈希表。
关于hcreate()函数的使用,以下是一些常见的注意事项:(1)创建哈希表时,需要事先确定哈希表的大小,然后将该大小作为参数传递给hcreate()函数。
(2)hcreate()函数返回值为0时表示成功创建哈希表,否则表示创建哈希表失败。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
哈希查找算法的源代码 c语言【问题描述】针对自己的班集体中的“人名”设计一个哈希表,使得平均查找长度不超过R,完成相应的建表和查表程序。
[基本要求]假设人名为中国姓名的汉语拼音形式。
待填入哈希表的人名共有30个,取平均查找长度的上限为2。
哈希函数用除留余数法构照,用链表法处理冲突。
[测试数据]读取熟悉的30个人的姓名。
#include <fstream>#include <iostream>#include <cmath>using namespace std;#define Maxsize 57struct record{ char name[20];char tel[20];char add[20];};typedef record * precord;struct HashTable{ int elem[Maxsize]; //存放数组a[]的下标int count;};typedef HashTable * pHashTable;int Number; //统计当前数组a[]中的记录总数void Getdata(precord a) //从文件telphone.txt中读取数据存放到数组a[] { Number=0;ifstream infile("telphone.txt",ios::in|ios::binary);if(!infile) {cout<<"文件打开失败!\n"; exit(1);}while(!infile.eof() && infile.get()!=EOF) //文件不为空并且文件指针没有指到结束符{infile.seekg(Number*sizeof(a[Number]),ios::beg); //定位文件指针infile.read((char *)&a[Number],sizeof(a[Number]));Number++;}infile.close();}void Add(precord a) //添加记录{ int i,num;cout<<"当前文件内已有"<<Number<<"条记录\n";cout<<"请输入添加的个数:";cin>>num;ofstream ofile("telphone.txt",ios::app);if(! ofile) {cout<<"文件打开失败!"; exit(1);}for(i=0;i<num;i++){ cout<<"请输入第"<<Number+1<<"个人的姓名"<<endl; cin>>a[Number].name;cout<<"请输入第"<<Number+1<<"个人的电话"<<endl; cin>>a[Number].tel;cout<<"请输入第"<<Number+1<<"个人的地址"<<endl; cin>>a[Number].add;ofile.seekp(ios::end);ofile.write((char *)&a[Number],sizeof(a[Number])); Number++;}ofile.close();}void Print(precord a) //显示所有记录{ int i;for(i=0;i<Number;i++){cout<<"第"<<i+1<<"个人的信息为:\n";cout<<" 姓名:"<<a[i].name<<endl;cout<<" 电话:"<<a[i].tel<<endl;cout<<" 地址:"<<a[i].add<<endl;}}int Hash(char str[]) //除留取余{ long val=0;char p[20],*p1;strcpy(p,str);p1=p;while(*p1!='\0')val=val+*p1++; //将字符串中的所有字符对应的ASCII值相加return(val%Maxsize);}int derter; //线性增量int Line_Sollution(int address) //采用线性探测解决冲突{derter++;if(derter==Maxsize) return(-1);else return((address+derter)%Maxsize);}int n;int Square_Sollution(int address) //采用平方探测法解决冲突{ int j;derter++;if(derter==Maxsize) return -1;n=n*(-1);j=(int(pow(derter,2))*n+address)%Maxsize;return(j);}void Init_Hash(pHashTable h) //初始化哈希表{ int i;for(i=0;i<Maxsize;i++)h->elem[i]=-1;}int menu;void Creathash_Name(pHashTable h,precord a)//以用户名为关键字创建哈希表{ cout<<"--------------------------------------------------------------------------------\n";cout<<" 1----以线性探测建表\n";cout<<" 2----以平方探测建表\n";cout<<"--------------------------------------------------------------------------------\n";int i,address;cin>>menu;Init_Hash(h);for(i=0;i<Number;i++){ derter=0;n=-1;address=Hash(a[i].name);while(h->elem[address]!=-1){if(menu==1) address=Line_Sollution(address);else address=Square_Sollution(address);if(address==-1) break;}if(address!=-1) { h->elem[address]=i; h->count++;}}cout<<"姓名哈希表已成功建立!\n";}void Search_Name(pHashTable h,precord a) //查找并显示指定姓名的记录{ cout<<"请输入要查找的姓名:";char nam[20];int address,i=1;cin>>nam;address=Hash(nam);derter=0;n=-1;while(h->elem[address]!=-1 && strcmp(nam,a[h->elem[address]].name)!=0) { if(menu==1) address=Line_Sollution(address);else address=Square_Sollution(address);i++;if(address==-1) break;}if(h->elem[address]!=-1 && strcmp(nam,a[h->elem[address]].name)==0) { cout<<"你要查找的信息为:\n";cout<<" 姓名:"<<a[h->elem[address]].name<<endl;cout<<" 电话:"<<a[h->elem[address]].tel<<endl;cout<<" 地址:"<<a[h->elem[address]].add<<endl;cout<<"比较次数为"<<i<<endl;}else cout<<"无此姓名,查找失败!";}void Creathash_tel(pHashTable h,precord a)//以电话号为关键字创建哈希表{ cout<<"--------------------------------------------------------------------------------\n";cout<<" 1----以线性探测建表\n";cout<<" 2----以平方探测建表\n";cout<<"--------------------------------------------------------------------------------\n";int i,address;cin>>menu;Init_Hash(h);for(i=0;i<Number;i++){ derter=0;n=-1;address=Hash(a[i].tel);while(h->elem[address]!=-1){if(menu==1) address=Line_Sollution(address);else address=Square_Sollution(address);if(address==-1) break;}if(address!=-1) { h->elem[address]=i; h->count++;}}cout<<"电话号哈希表已成功建立!\n";}void Search_tel(pHashTable h,precord a)//查找并显示指定电话号的记录{ cout<<"请输入要查找的电话:";char telphone[20];int address,i=1; //i统计比较次数cin>>telphone;address=Hash(telphone);derter=0; n=-1; //初始化线性增量while(h->elem[address]!=-1 && strcmp(telphone,a[h->elem[address]].tel)!=0){ if(menu==1) address=Line_Sollution(address);else address=Square_Sollution(address);i++;if(address==-1) break;}if(h->elem[address]!=-1 && strcmp(telphone,a[h->elem[address]].tel)==0) { cout<<"你要查找的信息为:\n";cout<<" 姓名:"<<a[h->elem[address]].name<<endl;cout<<" 电话:"<<a[h->elem[address]].tel<<endl;cout<<" 地址:"<<a[h->elem[address]].add<<endl;cout<<"比较次数为"<<i<<endl;}else cout<<"无此电话,查找失败!";}void Menu() //功能菜单函数{for(int i=1;i<=5;i++)cout<<endl;cout<<" 电话号码查询系统\n";cout<<'\n';cout<<" ★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆\n";cout<<" ☆ 0-------退出★\n";cout<<" ★ 1-------添加☆\n";cout<<" ☆ 2-------显示所有★\n";cout<<" ★ 3-------以性命建立哈希表☆\n";cout<<" ☆ 4-------以电话建立哈希表★\n";cout<<" ★ 5-------按用户名查找☆\n";cout<<" ☆ 6-------按电话号查找★\n";cout<<" ☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★\n"; cout<<" 使用说明:\n";cout<<" 1.添加新纪录后,如要进行查找请先进行3或4操作\n";cout<<" 2.按用户名查找之前,请先进行3操作建立用户名哈希表\n";cout<<" 3.按用户名查找之前,请先进行4操作建立电话号哈希表\n";}void exit(){int i;for(i=1;i<=4;i++)cout<<endl;cout<<" ◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◇◆◇\n"; cout<<" ◆ ◆\n";cout<<" ◇ 电话号码查询系统◇\n";cout<<" ◆ ◆\n";cout<<" ◇ 谢谢您的使用! ◇\n";cout<<" ◆ ◆\n";cout<<"◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇\n";}int main(){ record a[Maxsize];pHashTable H=new HashTable;Getdata(a); //将文件中的数据读入到数组a中start:Menu();int menu1;cin>>menu1;switch(menu1){ case 0:system("cls");exit();break;case 1:Add(a);system("pause");system("cls");goto start;break;case 2:Print(a);system("pause");system("cls");goto start;break;case 3:Creathash_Name(H,a);system("pause");system("cls");goto start;break;case 4:Creathash_tel(H,a);system("pause");system("cls");goto start;break;case 5:Search_Name(H,a);system("pause");system("cls");goto start;break;case 6:Search_tel(H,a);system("pause");system("cls");goto start;break;default:cout<<"请输入正确的操作选项!\n";system("cls");goto start;break;} return 0; }。