69,369
社区成员
发帖
与我相关
我的任务
分享
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define SUCCESS 1
#define UNSUCCESS 0
#define DUPLICATE -1 //插入时已存在
#define NULLKEY NULL
int htsize[]={19,31,81}; //处理冲突用 配置hashtable大小
int l;//哈希表当前表长
typedef struct{
char *key;
char *value;
}HashEle; //hash数据元素
typedef struct{
HashEle *elem; //HashEle数组
int count;
int index; // htsize[index]为当前容量
}HashTable;
//哈希函数 除留余数法
int Hash(char key){
return (key)/l;
}
//冲突处理,重置*p值
void Collision(int *p,int count){
*p=(*p+count)%l;
}
//初始化哈希表
int InitHash(HashTable *ht){
int i;
char nullval='\0';
(*ht).count=0;
(*ht).index=0;
l=htsize[(*ht).index];
(*ht).elem=(HashEle*)malloc(l*sizeof(HashEle));//分配初始空间;
if(!(*ht).elem)
return UNSUCCESS;
for(i=0;i<l;i++){
//赋初始值
(*ht).elem[i].key=&nullval;
printf("-%c-",*((*ht).elem[i].key));
}
return SUCCESS;
}
//重建哈希表
int RecreateHash(HashTable *ht){
printf("重建哈希表功能待编辑……");
return UNSUCCESS;
}
//注销哈希表并释放资源
void DestoryHash(HashTable *ht){
free((*ht).elem); //释放资源
(*ht).elem=NULL;
(*ht).count=0;
(*ht).index=0;
l=0;
}
int EQ(HashTable ht,int *p,char k);
//查找
int SearchHash(HashTable ht,char k,int *p,int *c){
*p=Hash(k);
printf("-%c-",*(ht.elem[*p].key));
while(*(ht.elem[*p].key)!=NULLKEY && !EQ(ht,p,k) && *c<l){
//取得下一冲突地址
Collision(p,*c);
(*c)++;
}
if(EQ(ht,p,k))
return SUCCESS;
return UNSUCCESS; //*p为下次可插入地址
}
//插入
int InsertHash(HashTable *ht,HashEle elem){
int c=0,p;
printf("insert:'%c'\n",*((*ht).elem[0].key));
if(SearchHash(*ht,*(elem.key),&p,&c))//如果该值已存在
return DUPLICATE;
else if(c>=htsize[(*ht).index]){//如果冲突次数达到上限
printf("size:%d",htsize[(*ht).index]);
RecreateHash(ht);
}
else{
(*ht).elem[p]=elem;
(*ht).count++;
return SUCCESS;
}
return UNSUCCESS;
}
/**
* 比较函数
* param:HashTable ht,int *p,char k
**/
int EQ(HashTable ht,int *p,char k){
printf("%d 比较值:ht-k -%c- k:-%c- \n",*p,*(ht.elem[*p].key),k);
//如果已存在
if(*(ht.elem[*p].key)==k)
return SUCCESS;
return UNSUCCESS;
}
void main(){
char c;
printf('%c',c);
int i,returnVal;
//初始化hashtable
HashTable ht;
if(InitHash(&ht))
printf("初始化hashtable成功!\n");
char k='a',v='b';
HashEle e={&k,&v};
returnVal=InsertHash(&ht,e);
printf("插入结果:%d",returnVal);
DestoryHash(&ht);
printf("注销hashtable!\n");
}
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define SUCCESS 1
#define UNSUCCESS 0
#define DUPLICATE -1 //插入时已存在
#define NULLKEY NULL
int htsize[]={19,31,81}; //处理冲突用 配置hashtable大小
int l;//哈希表当前表长
typedef struct{
char *key;
char *value;
}HashEle; //hash数据元素
typedef struct{
HashEle *elem; //数组
int count;
int index; // htsize[index]为当前容量
}HashTable;
//哈希函数 除留余数法
int Hash(char key){
return (key)/l;
}
//冲突处理,重置*p值
void Collision(int *p,int count){
*p=(*p+count)%l;
}
//初始化哈希表
int InitHash(HashTable *ht){
int i;
char nullval='\0';
(*ht).count=0;
(*ht).index=0;
l=htsize[(*ht).index];
(*ht).elem=(HashEle*)malloc(l*sizeof(HashEle));//分配初始空间;
if(!(*ht).elem)
return UNSUCCESS;
for(i=0;i<l;i++){
//赋初始值
(*ht).elem[i].key=&nullval;
printf("-%c-",*((*ht).elem[i].key));
}
return SUCCESS;
}
//重建哈希表
int RecreateHash(HashTable *ht){
printf("因hashtable当前空间不足,重建哈希表,该功能待编辑……\n");
return UNSUCCESS;
}
//注销哈希表并释放资源
void DestoryHash(HashTable *ht){
free((*ht).elem); //释放资源
(*ht).elem=NULL;
(*ht).count=0;
(*ht).index=0;
l=0;
}
int EQ(HashTable ht,int *p,char k);
//查找
int SearchHash(HashTable ht,char k,int *p,int *c){
*p=Hash(k);
//printf("-%c-",*(ht.elem[*p].key));
while(*(ht.elem[*p].key)!=NULLKEY && !EQ(ht,p,k) && *c<l){
//取得下一冲突地址
Collision(p,*c);
(*c)++;
}
if(EQ(ht,p,k))
return SUCCESS;
return UNSUCCESS; //*p为下次可插入地址
}
//插入
int InsertHash(HashTable *ht,HashEle elem){
int c=0,p;
//printf("insert:'%c'\n",*((*ht).elem[0].key));
if(SearchHash(*ht,*(elem.key),&p,&c))//如果该值已存在
return DUPLICATE;
else if(c>=htsize[(*ht).index]){//如果冲突次数达到上限
//printf("size:%d",htsize[(*ht).index]);
RecreateHash(ht);
}
else{
(*ht).elem[p]=elem;
(*ht).count++;
return SUCCESS;
}
return UNSUCCESS;
}
/**
* 比较函数
* param:HashTable ht,int *p,char k
**/
int EQ(HashTable ht,int *p,char k){
//printf("%d 比较值:ht-k -%c- k:-%c- \n",*p,*(ht.elem[*p].key),k);
//如果已存在
if(*(ht.elem[*p].key)==k)
return SUCCESS;
return UNSUCCESS;
}
void main(){
int i,returnVal;
//初始化hashtable
HashTable ht;
if(InitHash(&ht))
printf("初始化hashtable成功!\n");
char k,v;
printf("输入两个字符作为key和value,用空格隔开后回车:\n");
scanf("%c %c",&k,&v);
HashEle e={&k,&v};
returnVal=InsertHash(&ht,e);
printf("插入结果:%d\n (0表示失败、1表示成功,-1表示已存在)\n",returnVal);
DestoryHash(&ht);
printf("注销hashtable!\n");
}