标签:数据结构
#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; }
标签:数据结构
原文地址:http://11234080.blog.51cto.com/11224080/1773208