相同散列地址的记录链成一个单链表,m个散列地址就设m个单链表的表头指针存储起来,形成一个动态的结构
例子:关键字{19,14,23,1,68,20,84,27,55,11,10,79}
Hash(key)=key mod n(也就是对key取余)(n通常取散列表长度)
设散列函数为 Hash(key)=key% 13
则可得结果:
用c实现:
#include <stdio.h>
#include <stdlib.h>
#define m 13//表长为13
typedef struct Link{
int data;
struct Link *next;
}*Link,LNode;
typedef struct SqList{
struct Link *firstlink;
}SqList[m];
void ChainAddress(SqList s,int x){
int hash;
Link p=(Link)malloc(sizeof(LNode));
hash=x%m;
p->data=x;
p->next=s[hash].firstlink;//头插
s[hash].firstlink=p;
}
void getAddress(SqList s,int x){
int hash=x%m;
Link p=s[hash].firstlink;
while(p!=NULL){
if(p->data==x)
printf("所查的值=%d\n",p->data);
p=p->next;
}
}
void printChain(SqList s){
int i;
Link p;
for(i=0;i<m;i++){
printf("和表长的余数为%d的有:",i);
p=s[i].firstlink;
while(p){
printf("%d\t",p->data);
p=p->next;
}printf("\n");
}
}
int main(){
int i;SqList s;
int a[m]={13,19,8,23,2,25,20,84,27,55,11,10,79};
for(i=0;i<m;i++){//为邻接表初始化
s[i].firstlink=(Link)malloc(sizeof(Link));
s[i].firstlink=NULL;
}
for(i=0;i<m;i++){ChainAddress(s,a[i]);}
printChain(s);
getAddress(s,11);
system("pause");
return 0;
}
最后,若求某个值在SqList中的位置,则只需将该值取余定位到SqLsit[取余后的结果]即可,若该指针域不为空,则遍历此链表(类似于上面的插入过程)