哈希表c语言(C语言哈希表)
本文目录
- C语言哈希表
- 希望大家帮帮我啊!!!C语言 哈希表生成及哈希查找算法 输入:待哈希数据序列 功能要求:输出哈希方法和
- 数据结构 哈希表,C语言解答
- 针对自己的班集体中的“人名”设计一个哈希表,使得平均查找长度不超过R,完成相应的建表和查表程序
- C语言高手来看看
- c语言hash函数有几种
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;}
更多文章:
jsoup下载图片(java android jsoup怎么安装)
2026年4月19日 01:00
originos系统最新版本(怎么看originos是2.0还是3.0)
2026年4月19日 00:20






