#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作为参数,目的是对于全局变量直接使用
运行结果如下: