#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"
int Get_HashAddress(int key)
{
return key % MAXSIZE;
}
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;
}
}
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;*/
}
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;
//}
}
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");
//}
}
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);