第十五题用拉链法实现散列表 POWERBY KTL

该博客介绍如何使用拉链法解决散列冲突,通过一个C语言程序展示了散列表的插入、删除操作。程序中定义了散列函数H(k),并以6为除留余数,链表长度为6,关键字数量为6。博客内容包括输入关键字序列,初始化散列表,查找关键字并在找到时输出。
摘要由CSDN通过智能技术生成

/*
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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值