P272 例11-5 哈希表设计。要求: (1)哈希函数采用除留余数法,解决哈希冲突方法采用开放定址法的线性探查法。 (2)设计函数表构造头文件。头文件包括节点结构体定义,以及哈希表初始化、哈希表元素

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;
}
  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值