P272 例11-5 哈希表设计。要求:
(1)哈希函数采用除留余数法,解决哈希冲突方法采用开放定址法的线性探查法。
(2)设计函数表构造头文件。头文件包括节点结构体定义,以及哈希表初始化、哈希表元素插入、哈希表元素删除、哈希表查找和哈希表撤销函数。
(3)设计一个测试程序进行测试。要求首先建立包括数据元素{180,750,600,430,541,900,460}的哈希表,然后输出所建立的哈希表,并查找数据元素430是否在哈希表中,最后删除数据元素430,并再次查找数据元素430是否哎哈希表中。
(4)建立包括数据元素{180,750,600,430,541,900,460}的哈希表,要求把m取值改为11,分析输出结果。
头文件:HashList.h
#include<stdio.h>
#include<stdlib.h>
typedef int KeyType;
typedef enum
{Empty,Active,Deleted}KindOfItem;
typedef struct
{
KeyType key;
}DataType;
typedef struct
{
DataType data;
KindOfItem info;
}HashItem;
typedef struct
{
HashItem *ht;
int tableSize;
int currentSize;
}HashTable;
int Initiate(HashTable *hash,int mSize)
{
hash->tableSize=mSize;
hash->ht=(HashItem *)malloc(sizeof(HashItem)*mSize);
if(hash->ht==NULL)
return 0;
else
{
hash->currentSize=0;
return 1;
}
}
int Find(HashTable *hash,DataType x)
{
int i=x.key%hash->tableSize;
int j=i;
while(hash->ht[j].info==Active&&hash->ht[j].data.key!=x.key)
{
j=(j+1)%hash->tableSize;
if(j==i)
return -hash->tableSize;
}
if(hash->ht[j].info==Active)
return j;
else
return -j;
}
int Insert(HashTable *hash,DataType x)
{
int i=Find(hash,x);
if(i>0)
return 0;
else if(i!=-hash->tableSize)
{
hash->ht[-i].data=x;
hash->ht[-i].info=Active;
hash->currentSize++;
return 1;
}
else
return 0;
}
int Delete(HashTable *hash,DataType x)
{
int i=Find(hash,x);
if(i>=0)
{
hash->ht[i].info=Deleted;
hash->currentSize--;
return 1;
}
else
return 0;
}
void Destroy(HashTable *hash)
{
free(hash->ht);
}
源文件:P272 例11-5.c
#include"HashList.h"
int main()
{
HashTable myHashTable;
DataType a[]={180,750,600,430,541,900,460},item={430};
int i,j,k,n=7,m=13;
Initiate(&myHashTable,m);
for(i=0;i<n;i++)
Insert(&myHashTable,a[i]);
for(i=0;i<n;i++)
{
j=Find(&myHashTable,a[i]);
printf("j=%d ht[]=%d\n",j,myHashTable.ht[j].data.key);
}
k=Find(&myHashTable,item);
if(k>=0)
printf("查找成功,元素%d的哈希地址为%d\n",item.key,k);
else
printf("查找失败\n");
Delete(&myHashTable,item);
k=Find(&myHashTable,item);
if(k>=0)
printf("查找成功,元素%d的哈希地址为%d\n",item.key,k);
else
printf("查找失败\n");
Destroy(&myHashTable);
return 0;
}