用c语言实现基本数据结构(哈希表)

用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"));
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值