hash表的顺序表和链表实现

思维导图:



1.利用顺序表结构实现 

#include <stdio.h>
#include <malloc.h>
#define MaxSize 100
#define NULLKEY -1
#define DELKEY -2
typedef int KeyType;
typedef char*InfoType;
typedef struct
{KeyType key;
InfoType data;
int count;
}HashTable;

/*****************************************************************/
HashTable *InitHT(int m)
{
 HashTable *H;
 int i;
 H=(HashTable *)malloc(MaxSize*sizeof(HashTable));
 if(!H) return NULL;
 for(i=0;i<m;i++)
 {
  H[i].key=NULLKEY;
  H[i].data=NULL;
  H[i].count=0;
 }
 return H;
}
/*****************************************************************/
void InsertHT(HashTable *ha,int *n,KeyType k,int p)
{int i,adr;
adr=k%p;
if(ha[adr].key==NULLKEY||ha[adr].key==DELKEY)
{
 ha[adr].key=k;
 ha[adr].count=1;
}
else 
{
 i=1;
 do
 {
  adr=(adr+1)%p;
  i++;
 }while(ha[adr].key!=NULLKEY && ha[adr].key!=DELKEY);
 ha[adr].key=k;
 ha[adr].count=i;
}
*n++;
}
/*******************************************************************/
/*********x[n]为关键字数组*******************************************/
void CreateHT(HashTable *ha,KeyType *x,int n,int p)
{
 int i,nl=0;
 for(i=0;i<n;i++)
  InsertHT(ha,&nl,x[i],p);
}
/********************************************************************/
int SearchHT(HashTable *ha,int p,KeyType k)
{
 int i=0,adr;
 adr=k%p;
 while(ha[adr].key!=NULLKEY && ha[adr].key!=k) /********设i<p********/
 {
  i++;
  adr=(adr+1)%p;
 }
 if(ha[adr].key==k)
  return adr;
 else 
  return -1;
}
/*********************************************************************/
void DeleteHT(HashTable *ha,int p,int k,int *n)
{ 
 int adr;
 adr=SearchHT(ha,p,k);
 if(adr!=-1)
 {
  ha[adr].key=DELKEY;
  *n--;
 }
 else
 {
  printf("在哈希表中未找到要删除的关键字%d",k);
  printf("\n");
 }
 return;
}
/***********************************************************************/
void DispHT(HashTable *ha,int n,int m)
{
 float avg=0;
 int i;
 printf("哈希表地址:\t");
 for(i=0;i<m;i++)
  printf("%3d",i);
 printf("\n");
 printf("哈希表关键字:\t");
 for(i=0;i<m;i++)
  if(ha[i].key==NULLKEY || ha[i].key==DELKEY)
   printf("   ");
  else
   printf("%3d",ha[i].key);
 printf("\n");
 printf("搜索次数:\t");
 for(i=0;i<m;i++)
  if(ha[i].key==NULLKEY || ha[i].key==DELKEY)
   printf("  0");
  else
   printf("%3d",ha[i].count);
 printf("\n");
 for(i=0;i<m;i++)
  if(ha[i].key!=NULLKEY && ha[i].key!=DELKEY)
   avg+=ha[i].count;
 avg=avg/n;
 printf("平均搜索长度ASL(%d)=%f\n",n,avg);
}
/************************************************************/
void main()
{
 int x[]={16,35,42,55,68,43,54,41,80,66};
 int n=10,m=13,p=13,i,k;
 HashTable *ha;
 ha=InitHT(m);
 CreateHT(ha,x,n,p);
 DispHT(ha,n,m);
 printf("输入待查关键字:");
 scanf("%d",&k);
 i=SearchHT(ha,p,k);
 if(i!=-1)
  printf("ha[%d].key=%d\n",i,k);
 else
  printf("未找到%d\n",k);
 printf("输入要删除的关键字:");
 scanf("%d",&k);
 DeleteHT(ha,p,k,&n);
 DispHT(ha,n,m);
 printf("输入要插入的关键字:");
 scanf("%d",&k);
 InsertHT(ha,&n,k,p);
 DispHT(ha,n,m);
 printf("\n");
}


 

2.利用单链表结构实现

#include <stdio.h>
#include <malloc.h>
#define MaxSize 100
#define NULLKEY -1
typedef int KeyType;
typedef char *InfoType;
typedef struct node
{
 KeyType key;
 InfoType data;
 int count;
 struct node *next;
}HashTable;
/****************************************************/
HashTable *InitHT(int m)
{
 HashTable *H;
 int i;
 H=(HashTable *)malloc(MaxSize*sizeof(HashTable));
 if(!H)
  return NULL;
 for(i=0;i<m;i++)
 {
  H[i].key=NULLKEY;
  H[i].data=NULL;
  H[i].count=0;
  H[i].next=NULL;
 }
 return H;
}
/*****************************************************/
void InsertHT(HashTable *ha,int *n,KeyType k,int p)
{
 int adr;
 HashTable *q;
 HashTable *g;
 adr=k%p;
 q=ha+adr;
 while(q->next && q->next->key<k)
  q=q->next;
 g=(HashTable *)malloc(sizeof(HashTable));
 g->key=k;
 g->count=q->count+1;
 g->next=q->next;
 q->next=g;
 q=g->next;
 while(q)
 {
  q->count++;
  q=q->next;
 }
 *n++;
}
/*********************************************************/
void CreateHT(HashTable *ha,KeyType *x,int n,int p)
{
 int i,nl=0;
 for(i=0;i<n;i++)
  InsertHT(ha,&nl,x[i],p);
}
/********************************************************/
int SearchHT(HashTable *ha,int p,KeyType k)
{
 int adr;
 HashTable *q;
 adr=k%p;
 q=ha+adr;
 while(q!=NULL && q->key!=k)
  q=q->next;
 if(q==NULL)
 {
  printf("%d不存在!\n",k);
  return -1;
 }
 else
 {
  printf("%d的位置是:第%d个位置的第%d个结点\n",k,adr,q->next);
  return adr;
 }
}
/***********************************************************/
void DeleteHT(HashTable *ha,int p,int k,int *n)
{
 int adr;
 HashTable *q,*r;
 adr=SearchHT(ha,p,k);
 if(adr!=-1)
 {
  q=ha+adr;
  while(q->key!=k)
  {
   r=q;
   q=q->next;
  }
  r->next=q->next;
  r=r->next;
  while(r!=NULL)
  {
   r->count--;
   r=r->next;
  }
  free(q);
  *n--;
 }
 else 
  printf("在哈希表中未找到要删除的关键字%d\n",k);
}
/*******************************************************************/
void DispHT(HashTable *ha,int n,int m)
{
 float avg=0;
 int i;
 HashTable *q;
 for(i=0;i<m;i++)
 {
  printf("%3d",i);
  printf("()");
  q=ha[i].next;
  if(q==NULL)
   printf("\n");
  else
  {
   while(q!=NULL)
   {
    printf("--->(%d)",q->key);
    avg=avg+q->count;
    q=q->next;
   }
   printf("\n");
  }
 }
 avg=avg/n;
 printf("平均搜索长度ASL(%d)=%g\n",n,avg);
}
/*******************************************************/
void main()
{
 int x[]={35,55,16,43,54,31,66,80,68,41};
 int n=10,m=13,p=13,i,k;
 HashTable *ha;
 ha=InitHT(m);
 CreateHT(ha,x,n,p);
 DispHT(ha,n,m);
 printf("(1)输入待查关键字:");
 scanf("%d",&k);
 i=SearchHT(ha,p,k);
 if(i!=-1)
  printf("ha[%d].key=%d\n",i,k);
 else
  printf("未找到%d\n",k);
 printf("(2)输入要删除的关键字:");
 scanf("%d",&k);
 DeleteHT(ha,p,k,&n);
 DispHT(ha,n,m);
 printf("(3)输入要插入的关键字:");
 scanf("%d",&k);
 InsertHT(ha,&n,k,p);
 DispHT(ha,n,m);
 printf("\n");
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值