哈希存储(散列存储)
为了快速定位数据
哈希表
哈希冲突 / 哈希矛盾
关键字不一样,但是映射之后结果一样
如何避免 哈希矛盾?
1、重新设计哈希函数,尽可能均匀散列分布在哈希表
2、开放定址法:向下寻找未存储的位置进行存放数据
3、链地址法: 将数据链表的首地址存入哈希表,只需将数据结点往链表后链接即可
哈希表创建
HSNode_t *hashtable[HASH_SIZE] = {NULL};
1、设计哈希函数
int hash_function(char key)
{if (key >= 'a' && key <= 'z'){return key-'a';}else if (key >= 'A' && key <= 'Z'){return key-'A';}else{return HASH_SIZE-1;}
}
2、插入哈希表
int insert_hashtable(HSDataTYpe data)
{int addr = hash_function(data.name[0]);HSNode_t *pnode = malloc(sizeof(HSNode_t));if (NULL == pnode){perror("fail malloc");return -1;}pnode->data = data;pnode->pnext = NULL;pnode->pnext = hashtable[addr];hashtable[addr] = pnode;return 0;
}
3、插入数据
void print_hash()
{for(int i = 0;i < HASH_SIZE ;++i){HSNode_t *p = hashtable[i];while(p != NULL){printf("name : %s tel : %s",p->data.name,p->data.tel);p = p->pnext;}}printf("\n");
}
4、遍历哈希表
HSNode_t *search_hash(char *name)
{HSNode_t *p = NULL;int addr = hash_function(name[0]);p = hashtable[addr];while(p != NULL){if(!(strcmp(p->data.name,name))){//return p;printf("name : %s tel : %s",p->data.name,p->data.tel);return p;}else{p = p->pnext;}}return NULL;}
5、数据查找
void destroy_hash()
{HSNode_t *p;for(int i = 0; i < HASH_SIZE;++i){while(hashtable[i] != NULL){p = hashtable[i];hashtable[i] = p->pnext;free(p);}}
}
二、算法