#ifndef __HASH_H__
#define __HASH_H__
typedef int datatype;
//定义节点类型
typedef struct Node{
datatype data; //数据域
struct Node *next; //指针域
}Node, *NodePointer;
//初始化哈希表
void hash_init(NodePointer hash[],int n);
//将元素存入哈希表中
void hash_insert(NodePointer hash[],int n,int key);
//遍历哈希表
void hash_show(NodePointer hash[],int n);
//哈希查找
int hash_search(NodePointer hash[],int n,int key);
#endif
#include<stdlib.h>
#include"hash.h"
#include <stdio.h>
//初始化哈希表
void hash_init(NodePointer hash[],int n){
for(int i=0;i<n;i++){
hash[i]=NULL;
}
printf("初始化成功\n");
}
//将元素存入哈希表中
void hash_insert(NodePointer hash[],int n,int key){
//通过哈希函数将锁定key所在的哈希表中的位置
int pos=key%n;//key所在的应该是hash[pos]这条链表
//申请节点封装数据
NodePointer p=(NodePointer)malloc(sizeof(Node));
if(NULL==p){
printf("空间申请失败\n");
return ;
}
//初始化
p->data=key;
p->next=NULL;
//将封装好的节点插入到hash[pos]这条链表中
p->next=hash[pos];
hash[pos]=p;
}
//遍历哈希表
void hash_show(NodePointer hash[],int n){
for(int i=0;i<n;i++){
printf("%d: ",i);
//定义遍历指针,遍历下标为i的数
NodePointer q=hash[i];
while(q!=NULL){
printf("%d->",q->data);
q=q->next;
}
printf("NULL\n");
}
}
//哈希查找
int hash_search(NodePointer hash[],int n,int key){
//根据所要查找的值,确定其所在的链表
int pos=key%n;
//定义遍历指针,从当前链表的第一个节点出发
NodePointer q=hash[pos];
while(q!=NULL&&q->data!=key){
q=q->next;
}
//对q进行判断
if(q==NULL){
printf("所要查找的值不在链表中\n");
return -1;
}else{
printf("查找成功,所要查找的值在链表中\n");
return 0;
}
}
#include"hash.h"
#include <stdio.h>
int main(int argc, const char *argv[])
{
int arr[10]={3,5,18,55,67,22,35,29,40,88};
NodePointer hash[13];//定义哈希表
//调用初始化函数
hash_init(hash,13);
//将所有元素存入哈希表中
for(int i=0;i<10;i++){
hash_insert(hash,13,arr[10]);
}
//调用遍历函数
hash_show(hash,13);
//调用哈希查找函数
hash_search(hash,13,22);
return 0;
}