- 设有一长度为m的散列空间:将某一数据集合中的数据存储在该散列空间中
- 散列函数:用来计算存储数据元素的地址的函数
H(k)=k%m(除留余法)
缺陷:容易造成堆积
容易产生冲突(即地址被占用)
解决冲突:
线性探查法:d=(d+1)%m/(d+i^2)%m
拉链法:其实就是用链表的结构特点,将要查找的元素范围急剧缩小
在里面进行查找,如果地址里内容为空或者跑完局部链没找到说明没有此元素 反之找到
#include<bits/stdc++.h>
#define N 13//哈希”数组”长度
using namespace std;
typedef struct node{
int data;
struct node *next;
}ElemSN;
ElemSN **CreateHash(int a[],int n)
{
ElemSN **head;
ElemSN *tail,*np;
head=(ElemSN **)malloc(N*sizeof(ElemSN *));
int i,t;
for(i=0;i<N;i++){//初始化哈希“数组“
head[i]=NULL;
}
for(i=0;i<n;i++){//创建哈希表
np=(ElemSN *)malloc(sizeof(ElemSN));
np->data=a[i];
np->next=NULL;
t=a[i]%N;//计算地址
for(tail=head[t];tail&&tail->next;tail=tail->next);//判断哈希数组是否为空
if(!tail){//为空,将新的结点链入
head[t]=np;
}
else{//不为空,将新结点尾插都已有链上
tail->next=np;
}
}
return head;
}
void PrintHash(ElemSN **head)
{
ElemSN *p;
int i;
cout<<"地址"<<"\t"<<"元素"<<"\t"<<"\n";
cout<<"...................."<<"\n";
for(i=0;i<N;i++){
cout<<i<<"\t";
for(p=head[i];p;p=p->next){
cout<<p->data<<"\t";
}
cout<<"\n";
}
}
ElemSN *FindKey(ElemSN **head,int key)
{
ElemSN *p;
int i;
i=key%N;
for(p=head[i];p&&p->data!=key;p=p->next);
return p;
}
int main()
{
int n,key;
cout<<"请输入哈希数组长度n:";
cin>>n;
ElemSN **head;
ElemSN *p;
int a[n];
cout<<"请输入元素:";
for(int i=0;i<n;i++){
cin>>a[i];
}
cout<<"请输入key:";
cin>>key;
head=CreateHash(a,n);
PrintHash(head);
p=FindKey(head,key);
if(!p){
cout<<"Not Found!";
}
else{
cout<<"\n"<<p->data;
}
return 0;
}