关闭

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

1256人阅读 评论(0) 收藏 举报

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

 

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:34482次
    • 积分:751
    • 等级:
    • 排名:千里之外
    • 原创:40篇
    • 转载:0篇
    • 译文:0篇
    • 评论:3条