数据结构-查找-哈希表

1.保留除数法

哈希表保留除数法又称质数除余法,设Hash表空间长度为m,选取一个不大于m的最大质数。

示例:key = 962148,哈希表大小m = 25,取质数23。哈希函数hash (key) = key % 23 = 12。

2.冲突的处理

链地址法:

3.节点和数组定义

cpp 复制代码
#define N 15
typedef int datatype;
typedef struct node
{
	datatype key;
	datatype value;
	struct node *next;
}listnode,*linklist;

typedef struct
{
	listnode data[N];
}hash;

创建

cpp 复制代码
hash *hash_create()
{
	hash *HT;
	//malloc
	if((HT = (hash *)malloc(sizeof(hash))) == NULL)
	{
		printf("malloc failed\n");
		return NULL;
	}
	//init
	memset(HT,0,sizeof(hash));
	//return 
	return HT;
}

插入

cpp 复制代码
int hash_insert(hash *HT,datatype key)
{
	linklist p;
	linklist q;
	if(HT == NULL)
		return -1;
	if((p = (linklist)malloc(sizeof(listnode))) == NULL)
	{
		printf("malloc failed\n");
		return -1;
	}
	p->key = key;//保存插入的值
	p->value = key % N;//计算出有效值
	p->next = NULL;//初始化
				   
	q = &(HT->data[key % N]);//保存找到的有效值地址,也就是链头
	while(q->next && q->next->key > key)
	{
		q = q->next;//继续往下寻找
	}
	p->next = q->next;//插入
	q->next = p;

	return 0;
}

查找

cpp 复制代码
linklist hash_search(hash *HT,datatype key)
{
	linklist p;
	if(HT == NULL)
		return NULL;

	p = &(HT->data[key % N]);//保存key的有效值的地址
	while(p->next && p->next->key != key)//进行比较
	{
		p = p->next;
	}
	if(p->next == NULL)//没有找到
	{
		printf("no find\n");
		return NULL;
	}
	else//找到了,p->next->key == key
	{
		printf("find\n");
		return p->next;
	}
}
相关推荐
smj2302_796826521 小时前
解决leetcode第3826题.最小分割分数问题
数据结构·python·算法·leetcode
数智工坊1 小时前
【数据结构-线性表】2.3 双链表-循环链表-静态链表-顺序表和链表比较
数据结构·链表
VT.馒头1 小时前
【力扣】2705. 精简对象
javascript·数据结构·算法·leetcode·职场和发展·typescript
im_AMBER2 小时前
Leetcode 113 合并 K 个升序链表
数据结构·学习·算法·leetcode·链表
王德博客2 小时前
【实现常见排序算法】直接插入排序的算法思想
数据结构·算法·排序算法
重生之后端学习2 小时前
146. LRU 缓存
java·数据结构·算法·leetcode·职场和发展
程曦曦2 小时前
原地删除有序数组重复项:双指针法的艺术与实现
数据结构·算法·leetcode
梵刹古音3 小时前
【C语言】 字符数组与多维数组
c语言·数据结构·算法
老师用之于民3 小时前
【DAY20】数据结构基础:(算法)排序、折半查找的函数实现
数据结构·算法·排序算法
闲人不梦卿3 小时前
数据结构之查找的方法
数据结构