用c语言实现基本数据结构(哈希表)
写这个哈希表总是段错误,找了半天的bug。。。原来是各种小错误不断,写得很蛋疼。
我是是用数组实现的,数组的最大值定义成的宏。一共只有四个函数,分别为初始化哈希表,构造哈希函数,将数据存进去,将数据取出来。
我假设的关键字范围为10以内的英文字母组合。
解决哈希冲突的方法用的线性探测。用这个,是因为比较简单。。。:)
结构体如下
struct hashdata{
int data;
char* key;
};
完整代码如下
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAXHASH 1000
struct hashdata{
int data;
char* key;
};
void initHash(struct hashdata* hashTable, int len){
for(int i = 0; i< len; i++){
hashTable[i].data = 0;
hashTable[i].key = NULL;
}
}
int convertHash(char * key){
int re = 0;
int len = strlen(key);
if(len > 10){
printf("key should less than 10 char");
}
for(int i = 0; i < len; i++){
re += (float)(key[i]-65)*MAXHASH/10/48;
}
return (int)re;
}
int saveHash(struct hashdata* hashTable, char* key, int data){
int pos = convertHash(key);
if(hashTable[pos].key == NULL){
hashTable[pos].data = data;
hashTable[pos].key = key;
}else if(!strcmp(hashTable[pos].key, key)){
hashTable[pos].data = data;
printf("\nsave success!\n");
return 1;
}else{
for(int i = 0; i< MAXHASH; i++){
pos = (pos+1)%MAXHASH;
if(hashTable[pos].key == NULL){
hashTable[pos].data = data;
hashTable[pos].key = key;
printf("\nsave success!\n");
return 1;
}
}
}
return 0;
}
int findHash(struct hashdata* hashTable, char* key){
int pos = convertHash(key);
if(hashTable[pos].key == NULL){
printf("\nno this data\n");
return 0;
}
if(!strcmp(hashTable[pos].key, key)){
return hashTable[pos].data;
}else{
for(int i = 0; i< MAXHASH; i++){
pos = (pos+1)%MAXHASH;
if(hashTable[pos].key == NULL){
return 0;
}
if(!strcmp(hashTable[pos].key, key)){
return hashTable[pos].key;
}
}
}
printf("\nno this data\n");
return 0;
}
测试代码如下
#include"myHash.h"
int main(){
struct hashdata* hashTable = (struct hashdata *)malloc(4*MAXHASH);
printf("-----------------------\n");
initHash(hashTable, MAXHASH);
printf("-----------------------\n");
saveHash(hashTable, "apple", 1000);
saveHash(hashTable, "you", 888);
saveHash(hashTable, "you", 999);
saveHash(hashTable, "tree", 20);
printf("-----------------------\n");
printf("%d\n", findHash(hashTable, "you") );
printf("%d\n", findHash(hashTable, "is"));
}