/*
15.编写对一组关键字,利用链地址法解决冲突,
散列函数为H(k),写出在此散列表中插入、删除元素的算法。
程序输入 参考书本p269 其中除留余数p为6 拉链长度M为6 关键字长度N为6
输入72 35 124 153 84 57
接着要求输入需要查找的关键字,本程序打印出来的是key而不是other,所以只要输出等于输入的关键字
程序就正确了。
*/
#include "stdio.h"
#include "stdlib.h"
#define p 6
#define M 6
#define N 6
typedef int keytype;
typedef char datatype;
typedef struct nodetype
{
keytype key;
datatype other;
struct nodetype *pNext;
}chainhash;
chainhash *HTC[M];
int H(keytype k)
{
return k%p;
}
chainhash *Chnsrch(chainhash *HTC[],keytype k)
{
chainhash *q;
q=HTC[H(k)];
while(q&&(q->key!=k))
q=q->pNext;
return q;
}
void Cinsert(chainhash *HTC[],chainhash * s)
{
int d;
chainhash *q;
q=Chnsrch(HTC,s->key);
if(q)
printf("ERROR");
else
{
d=H(s->key);
s->pNext=HTC[d];
HTC[d]=s;
}
}
void Init(chainhash * HTC[],int m,keytype key[],int n) //初始化HTC的函数
{
int i;
for(i=0;i<m;i++)
{
HTC[i]=NULL;
}
for(i=0;i<n;i++)
{
chainhash *s;
s=(chainhash *)malloc(sizeof(chainhash));
s->key=key[i];
Cinsert(HTC,s);
}
}
int main()
{
int i;
chainhash * d;
keytype k;
keytype key[N];
printf("请输入你的关键字序列:");
for(i=0;i<N;i++)
{
scanf("%d",&key[i]);
}
Init(HTC,M,key,N);
printf("现在的散列表状态为:/n");
for(i=0;i<M;i++){
d=HTC[i];
while(d!=NULL)
{
printf("%d ",d->key);
d=d->pNext;
}
}
printf("/n");
printf("请输入你要查找的关键字:");
scanf("%d",&k);
d=Chnsrch(HTC,k);
if(d->key==k)
{
printf("%d /n",d->key);
}
else{
printf("发生错误。。。/n");
}
return 0;
}