hashtable(哈希表)


#include <stdio.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[maxsize];


void InsertHT(HashTable ha,int &n,KeyType k,int p)  //注意:使用引用n作为函数参数,直接是引用的全局变量n
{
 int adr,i;
 adr = k%p;
 if(ha[adr].key==NULLKEY||ha[adr].key==DELKEY)
 {
  ha[adr].key = k;
  ha[adr].count =1;
 }
 else
 {
  i = 1; 
  while(ha[adr].key!=NULLKEY && ha[adr].key!=DELKEY)
  {
   adr = (adr+1)%p;
   i++;
  }
  ha[adr].key = k;
  ha[adr].count = i;
 }
 n++;
}

void CreateHT(HashTable ha,KeyType x[],int n,int m,int p)
{
 int i,n1=0;
 for(i=0;i<m;i++)    //初始化hash
 {
  ha[i].key = NULLKEY;
  ha[i].count = 0;
 }

 for(i=0;i<n;i++)   //逐个插入元素
  InsertHT(ha,n1,x[i],p);
}


int SearchHT(HashTable ha,int p,KeyType k)
{
 int adr,i=0;
 adr = k%p;
 while(ha[adr].key!=NULLKEY && ha[adr].key!=k)
 {
  adr = (adr+1)%p;
  i++;
 }
 if(ha[adr].key==k)
  return adr;
 else
  return -1;
}

 

int DeleteHT(HashTable ha,int k,int p,int &n)  //注意:使用引用n作为函数参数,直接是引用的全局变量n
{
 int adr;
 adr = SearchHT(ha,p,k);
 if(adr!=-1)
 {
  ha[adr].key = DELKEY;
  n--;
  return n;
 }
 else
  return 0;
}


void DisplayHT(HashTable ha,int n,int m)
{
 float arg=0;
 int i;
 printf("hash地址:/t");
 for(i=0;i<m;i++)
  printf("%3d",i);
 printf("/n");
 printf("hash关键字:/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("search次数:/t");
 for(i=0;i<m;i++)
 {
  if(ha[i].key==NULLKEY||ha[i].key==DELKEY)
   printf("   ");
  else
   printf("%3d",ha[i].count);
 }
 printf("/n");
 for(i=0;i<m;i++)
  if(ha[i].key!=NULLKEY && ha[i].key!=DELKEY)
   arg = arg+ha[i].count;
 arg = arg/n;
 printf("ASL(%d)=%g/n",n,arg);
}

 

int main()
{
 int x[]={16,74,60,43,54,90,46,31,29,88,77};
 int n=11,m=13,p=13,k=29,i;
 HashTable ha;
 CreateHT(ha,x,n,m,p);
 printf("/n");
 DisplayHT(ha,n,m);
 i = SearchHT(ha,p,k);
 if(i==-1)
  printf("未找到%d!/n",k);
 else
  printf("ha[%d].key = %d",i,k);
 printf("/n");
 k = 77;
 printf("删除关键字%d/n",k);
 DeleteHT(ha,k,p,n);
 DisplayHT(ha,n,m);
 i = SearchHT(ha,p,k);
 if(i==-1)
  printf("未找到%d!/n",k);
 else
  printf("ha[%d].key = %d",i,k);
 printf("插入关键字%d/n",k);
 InsertHT(ha,n,k,p);
 DisplayHT(ha,n,m);
 printf("/n");
 return 0;
}

 

 

注意:

(1)

typedef是类型定义的意思。typedef struct 是为了使用这个结构体方便。
具体区别在于:
若struct node {}这样来定义结构体的话。在申请node 的变量时,需要这样写,struct node n;
若用typedef,可以这样写,typedef struct node{}NODE; 。在申请变量时就可以这样写,NODE n;
区别就在于使用时,是否可以省去struct这个关键字。

 

 <1>在C中定义一个结构体类型要用typedef:
typedef struct Student
{
int a;
}Stu;
于是在声明变量的时候就可:Stu stu1;
如果没有typedef就必须用struct Student stu1;来声明。这里的Stu实际上就是struct Student的别名。
----------

另外这里也可以不写Student(于是也不能struct Student stu1;了)
typedef struct
{
int a;
}Stu;


<2>但在c++里很简单,直接
struct Student
{
int a;
};
于是就定义了结构体类型Student,声明变量时直接Student stu2;

 

(2)

注意InsertHT()和DeleteHT()都使用了应用n作为参数,目的是对于全局变量直接使用
 

 

 

 

 

运行结果如下:

 

 

  

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值