哈希表
2016-05-13 23:51
323 查看
#include <stdio.h> #include <stdlib.h> typedef struct //哈希 { int key; //哈希地址关键字 int hi; //哈希冲突次数 }DataType; typedef struct { DataType *data; int tableSize; //哈希长度 int curSize; //关键字长度 }HashTable; //创建哈希表,m为哈希长度,p为用于取模,hash[]处理的数组,n为关键字长度 void CreateHashTable(HashTable *H,int m,int p,int hash[],int n) { int i,addr; int sum=0; (*H).data = (DataType*)malloc(sizeof(DataType)); if ( !(*H).data ) { exit(-1); } for ( i=0 ; i<m ; i++ ) //初始化数组,未访问的关键字为-1,冲突次数为0 { (*H).data[i].key = -1; (*H).data[i].hi = 0; } for ( i=0 ; i<m ; i++ ) //哈希地址映射过程 { addr = hash[i]%p; if ( (*H).data[addr].key == -1 ) //关键字为访问过 { (*H).data[addr].key = hash[i]; (*H).data[addr].hi = 0; } else //访问过利用线性在哈希分地址 { do { addr = (addr+1)%m; sum++; }while ( (*H).data[addr].key != -1 ); (*H).data[addr].key = hash[i]; (*H).data[addr].hi = sum+1; } } (*H).tableSize = m; (*H).curSize = n; } void DisplayHashTable(HashTable H,int m) //输出哈希表 { int i; printf("输出哈希地址:\n"); for ( i=0 ; i<m ; i++ ) { printf("%-5d",i); } printf("\n"); printf("输出关键字:\n"); for ( i=0 ; i<m ; i++ ) { printf("%-5d",H.data[i].key); } printf("\n"); printf("输出冲突次数:\n"); for ( i=0 ; i<m ; i++ ) { printf("%-5d",H.data[i].hi); } printf("\n"); } int SearchKey(HashTable H,int k) //关键字查找 { int d,d1,m; m = H.tableSize; d = d1 = k%m; while ( H.data[d].key != -1 ) { if ( H.data[d].key == k ) { return d; } else { d = (d+1)%m; } if ( d == d1 ) { return -1; } } return -1; } int main(void) { int hash[]={23,99,13,16,76,97,0,6}; int m=8,p=8,n=8; int k,pos; HashTable H; CreateHashTable(&H,m,p,hash,n); DisplayHashTable(H,m); k=99; pos = SearchKey(H,k); printf("%d在哈希表中的关键字地址是:%d\n",k,pos); return 0; }
相关文章推荐
- 我是运营,我没有假期
- 注册表的组织结构
- DB2数据库的安装
- C#实现把指定数据写入串口
- “传奇”图象数据存储方式
- 修复mysql数据库
- SQLSERVER的非聚集索引结构深度理解
- 浅析SQL数据操作语句
- SQLServer 数据导入导出的几种方法小结
- 调整SQLServer2000运行中数据库结构
- 简述MySQL分片中快速数据迁移
- MySQL数据备份之mysqldump的使用详解
- C#基础语法:结构和类区别详解
- 深入c# 类和结构的区别总结详解
- c#结构和类的相关介绍
- C#实现窗体间传递数据实例
- C#中结构(struct)的部分初始化和完全初始化实例分析
- C#中的委托数据类型简介
- C#中类与结构的区别实例分析
- C#枚举类型与结构类型实例解析