数据结构(哈希函数)

#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_arr[MAXSIZE];

}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_arr[i].data;//数据域不使用 不用赋值

pla->LA_arr[i].next = NULL;

//pla->LA_arr[i].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_arr[index].next;

pla->LA_arr[index].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_arr[index].next;

pla->LA_arr[index].next = pnewnode;

return true;*/

}

//3.查找

LA_Node* Search_LA(LinkAddress* pla, int key)

{

int index = Get_HashAddress(key);

for (LA_Node* p = pla->LA_arr[index].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_arr[index].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_arr[i].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_arr[i].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_arr[index];

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_arr[index];

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);

相关推荐
昵称小白1 小时前
栈与单调栈专题
开发语言·算法
诙_1 小时前
C++数据结构--B树,B+树,B*树
数据结构·b树
心.c1 小时前
RAG文档解析 - pypdf、LlamaParse、DeepDoc、SimpleDirectoryReader到底怎么选?
python·算法·ai
AI科技星1 小时前
基于代数拓扑与等腰梯形素数对网格【乖乖数学】
人工智能·算法·决策树·机器学习·数学建模·数据挖掘·机器人
jghhh011 小时前
基于时差(TDOA)与 频差(FDOA) 的无源定位
算法
_深海凉_2 小时前
LeetCode热题100-回文链表
算法·leetcode·链表
pursuit_csdn2 小时前
力扣周赛 501
算法·leetcode·职场和发展
努力d小白2 小时前
leetcode70.爬楼梯
算法
AbandonForce2 小时前
LeetCode 滑动窗口个人思路详解
算法·leetcode·职场和发展