数据结构(哈希函数)

#pragma once

//之前已经学完的,顺序表,链表等 他们总是有一个共有的特征,数据和其存储之间是没有任何关系的

//现在的需求 让查找函数的时间复杂度达到O(1);

//让数据和其存储位置之间产生某种函数(映射)关系 这就是哈希

//6种哈希函数的构建方法

//除留取余法

//折叠法

//平方取中法

//数组分析法

//直接定址法

//随机数法 散列==哈希

//如果出现了哈希冲突 怎么解决

//4个解决哈希冲突的方法 哈希冲突 不同的关键字,却

//开发地址法 存储位置==f(关键字)

// // 1 开发指针法

// f1(key)=(f(key)+d1)MODm (d1=1,2,3,4,,.....)(线性探测法)

// 二次探针法

// 随机探测法

//再散列函数法

//公共区溢出法

// 通过哈希函数的计算得到的哈希地址 先去与基本表来对比 如果等于 则成功 如果不等于 则对其溢出表进行顺序表查找

// 使用场景 冲突的数据表很小时

//链地址法

//

#define MAXSIZE 12

typedef struct LA_Node

{

int date;

struct LA_Node* next;

}LA_Node;

typedef struct LinkADDress

{

LA_Node LA_arrMAXSIZE;

}LinkAddress;

//0 哈希函数调用

int Get_HashAddress(int key);

//1 初始化

void Init_LA(LinkAddress* pla);

//2 插入

bool Insert_LA(LinkAddress* pla, int key);

//3 查找

LA_Node* search_LA(LinkAddress* pla, int key);

//4 打印

void Show(LinkAddress* pla);

//5 删除

bool Delete_LA(LinkAddress* p

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <assert.h>

#include <memory.h>

#include "Link_Address.h"

//0.计算哈希地址函数

int Get_HashAddress(int key)

{

return key % MAXSIZE;

}

//1.初始化

void Init_LA(LinkAddress* pla)

{

for (int i = 0; i < MAXSIZE; i++)

{

//pla->LA_arri.data;//数据域不使用 不用赋值

pla->LA_arri.next = NULL;

//pla->LA_arri.next=NULL;

}

}

//2.插入

bool Insert_LA(LinkAddress* pla, int key)

{

LA_Node* p = Search_LA(pla, key);

if (p != NULL)

{

return true;

}

int index = Get_HashAddress(key);

LA_Node* pnewnode = (LA_Node*)malloc(sizeof(LA_Node));

if (pnewnode == NULL)

exit(EXIT_FAILURE);

pnewnode->date = key;

pnewnode->next = pla->LA_arrindex.next;

pla->LA_arrindex.next = pnewnode;

return true;

/* LA_Node* p = Search_LA(pla, key);

if (p != NULL)

{

return true;

}

int index = Get_HashAddress(key);

LA_Node* pnewnode = (LA_Node*)malloc(sizeof(LA_Node));

if (pnewnode == NULL)

exit(EXIT_FAILURE);

pnewnode->data = key;

pnewnode->next = pla->LA_arrindex.next;

pla->LA_arrindex.next = pnewnode;

return true;*/

}

//3.查找

LA_Node* Search_LA(LinkAddress* pla, int key)

{

int index = Get_HashAddress(key);

for (LA_Node* p = pla->LA_arrindex.next; p != NULL; p = p->next)

{

if (p->date == key)

{

return p;

}

}

return NULL;

//int index = Get_HashAddress(key);

//for (LA_Node* p = pla->LA_arrindex.next; p != NULL; p = p->next)

//{

// if (p->data == key)

// return p;

//}

}

//4.打印

void Show(LinkAddress* pla)

{

for (int i = 0; i < MAXSIZE; i++)

{

printf("第%d行:", i);

for (LA_Node* p = pla->LA_arri.next; p != NULL; p = p->next)

{

printf("%d->", p->date);

}

printf("\n");

}

//for (int i = 0; i < MAXSIZE; i++)

//{

// printf("第%d行; ", i);

// for (LA_Node* p = pla->LA_arri.next; p != NULL; p = p->next)

// {

// printf("%d->", p->data);

// }

// printf("\n");

//}

}

//5.删除

bool Delete_LA(LinkAddress* pla, int key)

{

//作业

int index = Get_HashAddress(key);

LA_Node* q = Search_LA(pla, key);

if (NULL == q)

return false;

LA_Node* p = &pla->LA_arrindex;

for (; p->next != q; p = p->next);

p->next = q->next;

free(q);

return true;

/*int index = Get_HashAddress(key);

LA_Node* q = Search_LA(pla, key);

if(q!=NULL)

return true;

LA_Node* p = &pla->LA_arrindex;

for (; p->next != q; p = p->next);

p->next = q->next;

free(q);

return true;*/

}

//int main()

//{

// LinkAddress head;

// Init_LA(&head);

//

// Insert_LA(&head, 12);

// Insert_LA(&head, 67);

// Insert_LA(&head, 56);

// Insert_LA(&head, 16);

// Insert_LA(&head, 25);

// Insert_LA(&head, 37);

// Insert_LA(&head, 22);

// Insert_LA(&head, 29);

// Insert_LA(&head, 15);

// Insert_LA(&head, 47);

// Insert_LA(&head, 48);

// Insert_LA(&head, 34);

//

// Show(&head);

//

// return 0;

//}

la, int key);

相关推荐
菜菜的顾清寒7 小时前
力扣HOT100(44)对称二叉树
数据结构·算法·leetcode
六bring个六7 小时前
c/c++面试踩坑笔记
c语言·数据结构·c++
吃好睡好便好7 小时前
矩阵的左乘和右乘
人工智能·学习·线性代数·算法·matlab·矩阵
我命由我123457 小时前
SEO 与 GEO 极简理解
java·linux·运维·开发语言·学习·算法·运维开发
月光刺眼8 小时前
🎶二分 · 双指针 · 滑动窗口 · 螺旋矩阵:数组算法四题拆解
javascript·算法
南境十里·墨染春水8 小时前
数据结构 —— 双向循环链表
数据结构·链表
海清河晏1118 小时前
字符串匹配:BF算法与KMP算法
数据结构·算法·visual studio
wandertp8 小时前
对信号处理及滤波器的理解---基于robomaster机器人嵌入式控制系统
arm开发·stm32·算法·信号处理
z小猫不吃鱼8 小时前
15 InstructGPT 论文精读:SFT + RLHF 如何让模型听懂指令?
人工智能·深度学习·算法·机器学习·语言模型·自然语言处理·gpt-3
见合八方8 小时前
【滤波器】热调谐FP滤波器
人工智能·算法