哈希表:除留余数发。
解决哈希冲突的方法:链地址法
head.h
#ifndef _HEAD_H_
#define _HEAD_H_
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
typedef struct Node
{
//数据域
int data;
//指针域
struct Node *next;
}*node;
void init(node hash[], int hash_len);//哈希表初始化
int max_prime(int m);//计算p
node create_node();//创建结点
int input_hash(node hash[], int key, int hash_len);//插入哈希表
void output(node hash[], int hash_len);//遍历哈希
int search_hash(node hash[], int key, int hash_len);//哈希查找
#endif
main.c
#include"head.h"
int main(int argc, const char *argv[])
{
//哈希表:把数组的元素存到哈希表,借助哈希表查找
int arr[]={41,54,67,12,111,999,333,444,555,666};
int len=sizeof(arr)/sizeof(arr[0]);
int hash_len=len*4/3;//哈希表长
node hash[hash_len];//指针数组
init(hash,hash_len);//初始化
//把数组元素存到哈希表
for(int i=0;i<len;i++){
input_hash(hash , arr[i], hash_len);
}
//遍历哈希表
output(hash,hash_len);
//按值查找
int key;
printf("请输入您要查找的值:");
scanf("%d", &key);
int flag=search_hash(hash,key,hash_len);
if(flag==-1){
printf("查找的元素不存在\n");
}else{
printf("查找的元素存在\n");
}
return 0;
}
test.c
#include"head.h"
/*
* function: 哈希表初始化
* @param [ in]
* @param [out]
* @return 无返回值
*/
void init(node hash[], int hash_len){
for(int i=0;i<hash_len;i++){
hash[i]=NULL;
}
}
/*
* function: 计算p
* @param [ in]
* @param [out]
* @return
*
*/
int max_prime(int m){
for(int i=m; i>=2;i--){
int count=0;
for(int j=1; j<=i;j++){
if(i%j==0){
count++;
}
}
if(count==2){
return i;
}
}
}
/*
* function: 创见节点
* @param [ in]
* @param [out]
* @return
*/
node create_node(){
node p=(node)malloc(sizeof(struct Node));
if(p==NULL){
return NULL;
}
p->data=0;
p->next=NULL;
return p;
}
/*
* function: 插入哈希表
* @param [ in]
* @param [out]
* @return 成功返回0,失败返回-1
*/
int input_hash(node hash[], int key, int hash_len){
//构建哈希表
int s=max_prime(hash_len);
int sub=key%s; //存入的哈希表下标
//把key存入哈希表sub位置
//创建新节点
node p=create_node();
if(p==NULL){
return -1;
}
p->data=key;//p的数据域
if(hash[sub]==NULL){
hash[sub]=p;
}else{
p->next=hash[sub]->next;
hash[sub]->next=p;
}
return 0;
}
/*
* function: 遍历哈希表
* @param [ in]
* @param [out]
* @return
*/
void output(node hash[], int hash_len){
for(int i=0; i<hash_len;i++){//循环每一个链表
printf("%d:", i);
node p=hash[i];
while(p!=NULL){
printf("%d\t", p->data);
p=p->next; //后移
}
printf("NULL\n");
}
}
/*
* function: 哈希查找
* @param [ in]
* @param [out]
* @return
*/
int search_hash(node hash[], int key, int hash_len){
int p=max_prime(hash_len);
int sub=key%p;
node s=hash[sub];
while(s!=NULL){
if(s->data==key){
return 0;
}
s=s->next;
}
return -1;
}