数据结构(哈希函数)

#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 分钟前
宠物行为识别AI算法详解:从数据采集到模型部署的完整方案
人工智能·深度学习·算法·宠物
石像鬼₧魂石11 分钟前
贵州商会管理系统 —— 商协会数字化运营一站式平台
大数据·数据结构·物联网·eclipse·数据库架构
王莎莎-MinerU12 分钟前
解析回归集:RAG 和 Agent 上线前,先把表格、公式、版面测清楚
人工智能·算法·数据挖掘·回归·pdf·ocr
Java面试题总结13 分钟前
区间树:反向映射的前置数据结构
java·前端·数据结构
KaMeidebaby17 分钟前
卡梅德生物技术快报|兔单克隆抗体:噬菌体 Fab 免疫文库搭建实操:兔单克隆抗体重组构建完整参数
前端·网络·数据库·人工智能·算法
AndrewHZ18 分钟前
【LLM技术全景】混合精度与分布式训练:训练大模型的工程奥秘
人工智能·分布式·深度学习·算法·ai·语言模型·llm
AI科技星1 小时前
基于全域数学公理体系求解三元约束极值题【乖乖数学】
人工智能·算法·机器学习·密码学·拓扑学·乖乖数学·全域数学
伊玛目的门徒9 小时前
试用leetcode之典中典 二数之和问题
java·算法·leetcode
Jerry9 小时前
LeetCode 226. 翻转二叉树
算法
想做小南娘,发现自己是女生喵10 小时前
【无标题】
数据结构·算法