哈希表的创建,查找
来源:互联网 发布:杭州淘宝村在哪里 编辑:程序博客网 时间:2024/05/17 23:22
采用处留余数法对哈希表进行构造,利用线性探测再散列法来进行冲突处理.根据用户名字(用户名字各个字母的ASCII码值相加,其和作为关键字(key) 对用户进行查找。
#include <stdio.h>#include <stdlib.h>#include <string.h>#include<malloc.h> struct student{int key;const char *p;};struct HASH{ int key ; int adrss; int reha; const char *m; int l; };struct student a[10]; //声明两个结构体数组 struct HASH b[20];void name_init() { a[0].p="liguohan";a[1].p="lilei";a[2].p="gechang";a[3].p="jiachao";a[4].p="liming";a[5].p="sunchouchou";a[6].p="yanghao";a[7].p="chenzhuoxin";a[8].p="mabiao";a[9].p="renyi";int i,j,k;for(i=0;i<10;i++) //用户name(结构体数组)初始化,用户名字各个字母ASCII 码值相加,其和作为关键字(key) {j=0;for(k=0;*(a[i].p+k)!='\0';k++){j+=*(a[i].p+k);a[i].key=j;}}}void HASH_init() //哈希表初始化 {int n; for(n=0;n<20;n++) { b[n].key=0; b[n].adrss=0; b[n].reha=0; b[n].m=" "; b[n].l=0; }}void creat_HASH() //哈希表创建 {name_init();HASH_init();int i;int count=0;for(i=0;i<10;i++){int m=a[i].key%15;int n=(a[i].key+1)%15; //线性探测再散列函数if(b[m].l==0){b[m].key=a[i].key;b[m].adrss=a[i].key%15;b[m].reha=(a[i].key+1)%15;b[m].m=a[i].p;b[m].l=1;}else{int temp;int c=1;do{temp=(a[i].key+c)%15;m=temp;count=count+1;c++;}while(b[m].l!=0);b[m].key=a[i].key;b[m].adrss=a[i].key%15;b[m].reha=(a[i].key+1)%15;b[m].m=a[i].p;b[m].l=count+1;}}}void find_name() //根据用户名查找 { char *s; s=(char*)calloc(20,sizeof(char)); int key=0,k=0,i,j=1,adr; printf("请输入用户名:"); scanf("%s",s); for(i=0;*(s+i)!='\0';i++){k+=*(s+i);key=k;} adr=key%15; if(b[adr].key==key) { printf("关键字为:%d\n",key); printf("初散列值为:%d\n",b[adr].adrss); printf("再散列值为:%d\n",b[adr].reha); printf("哈希地址为:%d\n",b[adr].adrss); printf("表中位置为:%d\n",adr); printf("查找长度为:%d\n",b[adr].l); } else if(b[adr].key==0) { printf("无此记录\n"); } else { int sign=1; while(sign) { int adr1; adr1=(b[adr].key+j)%15; adr=adr1; if(b[adr].key==0) { sign=0; printf("无此记录\n"); } else if(b[adr].key==key) { printf("关键字为:%d\n",key); printf("初散列值为:%d\n",b[adr].adrss); printf("再散列值为:%d\n",b[adr].reha); printf("初散列值为:%d\n",b[adr].adrss); printf("表中位置为:%d\n",adr); printf("查找长度为:%d\n",b[adr].l); break; //这个break要注意! } else j++; } } } void print_HASH() //打印哈希表 { int i; printf("关键码 初散列 再散列 哈希地址 查找次数 姓名\n"); for(i=0;i<20;i++) { printf("%d\t%d\t%d\t%d\t%d\t%s\t\n",b[i].key,b[i].adrss,b[i].reha,i,b[i].l,b[i].m);} } int main() { int temp; creat_HASH(); print_HASH(); while(1) { find_name(); printf("继续请输入1,输入其他值退出:\n"); scanf("%d",&temp); if(temp!=1) break; }
运行结果:
0 0
- 哈希表的创建,查找
- 二叉查找树的 创建 查找 访问
- 二叉排序树的创建和查找
- 查找不到创建的索引
- 二叉排序树的创建与查找
- 查找hive创建的视图
- 哈希表的常用操作:创建、插入、查找、删除
- 查找二叉树的创建插入查找删除
- 树形结构的查找(二叉排序树-创建、查找、插入、删除)
- 查找出最新创建的文件
- 二叉排序树的创建查找与删除
- 线段树的创建插入查找删除
- 链表--单链表的创建与查找
- 二叉排序树的创建,查找与删除
- 二叉数组的创建删除插入查找
- 单链表的创建+ 求表长+ 查找+插入+删除
- 二叉查找树的创建及遍历
- 二叉排序树的创建,查找,插入,删除
- 【解决问题】error: QtGui/QApplication: No such file or directory
- activity之销毁
- 模拟数据库实时进来数据,当某个数据元素等于出现总数为5的时候,删除第一次出现的元素值
- C语言问题总结
- java解析xml的4种经典方法
- 哈希表的创建,查找
- SpringMVC的@RequestMapping的用法
- project euler 12
- 贪吃蛇
- BFS 广度优先搜索 Oil Deposits
- json的使用(js对象表示法)
- maven 添加自己的包到本地仓库及到项目中
- iOS多态性 动态绑定 与动态类型
- activity之销毁(二)