思维导图:
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");
}